我很难弄清楚为什么当文档说一个承诺应该被拒绝时,它却在实现。
打开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
发布于 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,而不是延迟对象。
以下是您的示例的修订版,它将按照您的预期工作:
(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上推荐它。它们适用于不同的情况,但我发现大多数时候我更喜欢它。
希望这能有所帮助!
https://stackoverflow.com/questions/17715406
复制相似问题