2014-02-08 25 views
13

我使用支持Promise规范的Q库。但我也尝试使用不久前在Chrome中实现的Promise类(实验)。Chrome中的JavaScript Promise/Defer

Q中存在延期功能,可用于创建未履行的承诺,可以在将来解决或拒绝承诺。

我使用Chrome中提供的原生Promise实现了相同的功能。下面是一个例子:

var defer = function() { 
    var result = {}; 
    result.promise = new Promise(function(resolve, reject) { 
     result.resolve = function(value) { 
      resolve(value); 
     }; 
     result.reject = function(value) { 
      reject(value); 
     }; 
    }); 
    return result; 
}; 

var deferred = defer(); 
deferred.promise.then(function(value) { 
    alert(value); 
}); 
deferred.resolve(10); 

我很好奇这个解决方案中是否有任何设计缺陷,如性能下降或不正确。

回答

15

您正在创建不必要的函数对象。

你可以这样做:

var defer = function() { 
    var result = {}; 
    result.promise = new Promise(function(resolve, reject) { 
     result.resolve = resolve; 
     result.reject = reject; 
    }); 
    return result; 
}; 

设计缺陷被摆在首位这样做,本土的承诺是无用的,如果你使用的是Q.

+1

“原生承诺无用” - 为什么?难道不会有人期待更好的优化等吗? – Bergi

+2

首先承诺perf在客户端是没用的,其次原生承诺非常慢(几乎所有其他本地实现比用户实现都慢)。第三,ES6承诺的功能非常少,几乎不可用于开箱即用的实际项目。 – Esailija

+0

@Bergi iirc此刻的本土承诺比Q承诺快,但比Bluebird的承诺要慢 - 这确实不像Petka所说的那样。更麻烦的部分是,他们有比蓝鸟承诺更糟糕的堆栈痕迹:D –

5

为基准见http://bluebirdjs.com/docs/benchmarks.html。还有一些JSPerf基准测试,但是“对于合理的快速实现,实现延迟将完全由使用的调度器决定,因此对基准测试并不感兴趣。基准测试的JSPerfs倾向于基准延迟。”

+2

2015年更新? –