【问题标题】:when.all() 2.2.1 in cujojs doesn't reject if one deferred rejectedcujojs 中的 when.all() 2.2.1 如果一个延迟被拒绝,则不会拒绝
【发布时间】:2013-07-16 22:16:18
【问题描述】:

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

打开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() 文档说:如果任何一个 Promise 被拒绝,返回的 Promise 将被拒绝,并以第一个被拒绝的 Promise 的拒绝原因拒绝 - 请参阅 https://github.com/cujojs/when/blob/master/docs/api.md#whenall

【问题讨论】:

    标签: javascript promise deferred when-js


    【解决方案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。它们适用于不同的情况,但我发现大多数时候我更喜欢它。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多