首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cujojs中的when.all() 2.2.1不会在一个被延迟拒绝的情况下拒绝

cujojs中的when.all() 2.2.1不会在一个被延迟拒绝的情况下拒绝
EN

Stack Overflow用户
提问于 2013-07-18 13:45:03
回答 1查看 555关注 0票数 1

我很难弄清楚为什么当文档说一个承诺应该被拒绝时,它却在实现。

打开http://jsbin.com/orifok/5/edit并单击go按钮,当它应该警告"fail“时,它会提示"ok”。

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

我确实对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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-24 10:45:23

必须向when.all传递一个承诺,而不是延迟,程序员需要非常小心,以免犯下这个错误。

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

答案如下:

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

以下是您的示例的修订版,它将按照您的预期工作:

代码语言:javascript
复制
(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);
}

})();

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

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17715406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档