如何做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 });