如何做promise.all数组promise的数组?
我试图运行数组函数并行,当每个人都完成我想要的结果工作。 我正在使用承诺。 现在,我可以把所有的function在一个数组,并可以做Promise.all(数组的function),但我有像数组
[[promise1, promise2], [promise3,promise4], [promise5,promise6]],
每个承诺都是promisifiedfunction。 Promise参考文档中说Promise.all中的参数应该是一个可迭代的对象,我的数组是可迭代的。 但这不适合我。 我认为它正在执行[promise1,promise2]作为承诺,但不是个人承诺。
任何人都可以帮助我,我怎么能实现它或有没有更好的办法?
您还需要为每个数组项目调用Promise.all
:
const promise4all = Promise.all( promiseArray.map(function(innerPromiseArray) { return Promise.all(innerPromiseArray); }) );
或直接:
const promise4All = Promise.all(promiseArray.map(Promise.all))
这样外层的Promise.all
就可以获得其他Promise.all
的分组承诺:
promise4all.then(function(promiseGroupResult) { // promiseGroupResult is the actual result of each promise group // and you'll be able to get each result this way: promiseGroupResult.somePropertyName });
您可以在所有内部数组上使用Promise.all
,然后在外部数组上使用Promise.all
来获得数组数组的承诺:
Promise.all(promiseArrArr.map(Promise.all, Promise)).then(arrArr => …)
注意, Promise.all
接受一个Promise.all
数组,而不是一个promise返回函数的数组。
另一种select是将数组数组平铺到一个数组中,然后直接使用Promise.all()
。 直接从MDN上的例子 ,你可以使用.concat()
和.concat()
来做到这一点。
var promises = [[promise1, promise2], [promise3,promise4], [promise5,promise6]]; Promise.all(promises.reduce(function(a, b) { return a.concat(b); }, [])) .then(function(results) { // all done here // results are in a flattened array });
这个解决scheme允许原始承诺数组包含个体承诺或承诺数组或两者的任意组合。 这种方法灵活,它提供了一个单一的扁平化结果数组,其结果与原始承诺的顺序相同,但被平化为一个数组。 因为Promise.all()
要求你传递一个数组,所以在这里提出的其他解决scheme需要input是一个严格的数组数组 – 该数组不能有简单的承诺,只有承诺数组。 这种解决scheme比较灵活,可以接受任何一种input。
例如,如果input是这样的,这将工作得很好:
var promises = [promise1, promise2, [promise3, promise4], [promise5, promise6]];
查看工作演示: https : //jsfiddle.net/jfriend00/dLsktyyn/
或者你可能会发现将flatten()
函数放在其他用途中是很有用的:
function flatten(arr) { return arr.reduce(function(a, b) { return a.concat(b); }, []); } var promises = [[promise1, promise2], [promise3,promise4], [promise5,promise6]]; Promise.all(flatten(promises)).then(function(results) { // all done here });
你可以使用这种方法:
var promisesArray = [ [promise1, promise2], [promise3,promise4], [promise5,promise6] ].reduce(function (arr, item) { item.forEach(function (promise) { arr.push(promise); }); return arr; }, []); Promise.all(promisesArray).then(function () { // code });