当cujojs中的.all()2.2.1没有'如果延期拒绝,则不拒绝

when.all() 2.2.1 in cujojs doesn't reject if one deferred rejected

本文关键字:拒绝 如果 all 中的 cujojs 没有      更新时间:2023-09-26

当文档说应该拒绝承诺时,我很难弄清楚为什么承诺得到了履行。

打开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()documentatation表示:如果任何一个promise被拒绝,则返回的promise将被拒绝,拒绝原因为被拒绝的第一个promise-请参阅https://github.com/cujojs/when/blob/master/docs/api.md#whenall

tl;博士:when.all必须通过promise,而不是delay,程序员需要非常小心,不要犯那个错误。

Brian Cavalier在这里回答道:https://github.com/cujojs/when/issues/172修改后的代码如下:http://jsbin.com/orifok/10/edit

答案如下:

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

以下是您的示例的修订版本,它将如您所期望的那样工作:

(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还有一个新的、更轻的承诺创建API when.promise,我已经开始推荐它而不是when.defer。它们适合不同的情况,但我发现大多数时候我更喜欢它。

希望能有所帮助!