【问题标题】:$.when.apply not working when one of the promises in the array of promise is deferred当 promise 数组中的一个 promise 被延迟时,$.when.apply 不起作用
【发布时间】:2016-01-14 14:15:11
【问题描述】:

我有一个存储从不同函数返回的承诺的数组。我用过

_.each(someDiffArray,function(element){ 
       var promise = renderSomething(); 
       promiseArray.push(promise);
  } 

renderSomething 有时会返回延迟承诺。

$.when.apply($, promiseArray).done(function() {
    //doSomething
});

但是当promiseArray 中的一个或多个promise 被延迟并且它已解决并且其他promise 尚未完成或已解决控制将进入$.when.apply 的回调函数中。

我不知道为什么会这样,有人可以帮忙吗?是因为 deferred 的行为还是有其他问题?

【问题讨论】:

  • 请创建一个复制此行为的演示
  • 这不应该发生。你能用简单的fiddle 重现你的问题吗?
  • 如果promiseArray 中的任何请求失败,就会出现此行为 - 您是否检查过请求的状态代码?
  • Rory 是对的,您应该将回调更改为 .then 和 .catch 或 .error 以获得更好的实践。
  • @Rory,确实如此,但在那种情况下,done() 不会运行(fail()always() 会运行),所以我仍然无法以这种方式解释提问者观察到的行为。

标签: javascript jquery


【解决方案1】:

你可以使用像 BlueBird 这样的 promise 库。这是您要实现的目标的示例。以下是几个 promise 函数,根据它们的分辨率,我会做一些事情:

function a(){
    return Promise.resolve("a");
}
function b(){
    return Promise.resolve("b");
}
function c(){
    return Promise.resolve("c");
}
function d(){
    return Promise.resolve("d");
}
function e(){
    return Promise.resolve("e");
}
function f(){
    return Promise.resolve("f");
}

现在

Promise.all([
    a(),
    b(),
    c(),
    d(),
    e(),
    f()
]).then(function(response){
    console.log(response);
}).catch(function(er){
    console.error("Err: ", er);
})

then() 将在所有承诺成功解决时被调用,否则catch() 将在任何承诺被拒绝时被调用。小提琴:https://jsfiddle.net/6wk1uzqu/

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 2017-08-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多