1

当文档说应该拒绝时,我无法弄清楚为什么要履行承诺。

打开http://jsbin.com/orifok/5/edit并点击 go 按钮,当它应该提示“失败”时它会提示“ok”。

替换when221.all...deferred2.promise.then(stepFulfilled, stepRejected);并发生拒绝。

我确实对 when.js 代码进行了修改以使 when221 变量成为全局变量,而不是需要依赖于 require.js 库(参见http://pastebin.com/J8wCqjWM与原始https://github.com的比较/cujojs/when/blob/2.2.1/when.js)。

when.all() 文档说:如果任何承诺被拒绝,则返回的承诺将被拒绝,并以被拒绝的第一个承诺的拒绝原因 - 请参阅https://github.com/cujojs/when/blob/master /docs/api.md#whenall

4

1 回答 1

1

tl;dr: when.all 必须传递一个 promise,而不是 deferred,程序员需要非常小心,不要犯这个错误。

Brian Cavalier 在这里回答了这个问题:https ://github.com/cujojs/when/issues/172 ,修改后的代码在这里:http: //jsbin.com/orifok/10/edit

答案如下:

您好,您的示例代码将延迟对象传递给 when.all。延迟对象不是承诺。不幸的是,一些库,例如 jQuery,以及不可否认的 when.js 的早期版本,将 Promise 和 deferred 对象混为一谈。为了澄清,我最近开始将延迟对象简单地称为 {resolver, promise} 对。您应该将承诺而不是延迟对象传递给 when.all。

这是您的示例的修订版本,它将按您的预期工作:

(function(){
var deferred1 = when221.defer();
var deferred2 = when221.defer();

window.clickgo = function() {
  // Pass the promise, not the deferred
  when221.all([deferred1.promise, deferred2.promise]).then(stepFulfilled, stepRejected);
  deferred2.reject('foooo');
};

function stepFulfilled() {
    alert('ok');
}

function stepRejected(failed) {
    alert('failed ' + failed);
}

})();

另请注意,when,js >= 2.2.0 也有一个新的、更轻量级的 Promise 创建 API when.promise,我已经开始推荐它而不是 when.defer。它们适用于不同的情况,但我发现大多数时候我更喜欢它。

希望有帮助!

于 2013-07-24T02:45:22.617 回答