我正在使用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;
检查它是否同步解决,看起来似乎如此。但是,它可能只是我的异步功能足够快,实际上可以快速解决它。这看起来是对的吗?
答案 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()
的结果没有任何影响。