与Q.all(承诺)同步解决承诺

时间:2017-03-14 11:31:26

标签: javascript node.js asynchronous promise

我正在使用Kriskowal Q library来处理承诺。

我编写了以下函数,等待所有承诺都解决了。

function multiplePromises(targetArray) {
    var promises = {};
    for (var i=0; i<targetArray.length; i++) {
        var promise = singlePromise(); // any async. function
        promises[i] = promise;
    };
    return Q.all(promises);
};

我将其称为如下:

multiplePromises(targetArray).then(
     function(success){
         console.log("success");
     },
     function(error){
        console.log("error", error);
     }
);

我想知道是否存在一个解决承诺的顺序(例如,它是同步的吗?)。即函数是否等待触发下一个承诺i+1,直到承诺i被解决?或者与所有其他异步相似。方法,它实际上会触发所有单一的承诺,并等待它们全部完成?

如果第二种情况是这样,那么如何重写此函数以确保只有在承诺i+1解决后才会触发承诺i

更新:测试

我做了一个测试并放了:

promises[i] = i;

检查它是否同步解决,看起来似乎如此。但是,它可能只是我的异步功能足够快,实际上可以快速解决它。这看起来是对的吗?

3 个答案:

答案 0 :(得分:1)

有几种方法可以达到你想要的效果

对代码的最小更改将是

function multiplePromises(targetArray) {
    var promises = [];
    var p = Promise.resolve(); // I don't know the Q equivalent of this
    for (var i=0; i<targetArray.length; i++) {
        p = p.then(function() {
            return singlePromise();
        });
        promises[i] = p;
    };
    return Q.all(promises);
};

答案 1 :(得分:0)

承诺将按照您声明的顺序由Q执行,但无法确保退货订单是相同的。这就是异步的工作原理。

如果你想让他们按顺序解决,我能想到的唯一方法就是一个接一个地调用它们,而不是批量调用它们。

此其他回复将提供更多信息和一些解决方案: https://stackoverflow.com/a/36795097/7705625

答案 2 :(得分:0)

理论上的承诺可以按顺序解决(并且可以很容易地编写一个他们愿意的例子),但你永远不应该依赖它。

Promise.all()(或Q.all()Bluebird.all()等函数的全部要点是,如果等待所有承诺得到解决,无论顺序是什么那些,一旦它们全部被解决,那么Promise.all()本身返回的承诺将通过原始承诺解决的值数组来解析。

在该数组中,您将获得与作为Promise.all()的参数的数组中的promises顺序相同的顺序。但原始承诺得到解决的时间顺序尚不清楚且不相关,因为这对使用Promise.all()的结果没有任何影响。