如何迭代node.js中的promise数组?

在JavaScript中,我有一个非平面的Promise数组:

const array = [ [ promise11, promise12.. promise1n ], [ promise21, promise22.. promise2n ], [ promise31, promise32.. promise3n ], ... [ promisek1, promisek2.. promisekn ] ]; 

如何以这样一种方式遍历数组,在下一个承诺数组将在前一个承诺数组解决之后才开始解决? 例如,我希望脚本等待[ promise11, promise12.. promise1n ]承诺[ promise11, promise12.. promise1n ]解决,然后调用下一个承诺数组。

我正在寻找一个通用的解决scheme,因为我的应用程序无法预先知道需要多less个调用(这是一个webscrapper)。

可以Array#reduce模式上使用一个变体:

 array.reduce( (p, subArray) => p.then(() => Promise.all(subArray)), Promise.resolve() ); 

这build立了一个承诺链,其中链中的每个条目都是Promise.all中数组中的子数组的承诺的结果。

…但:

…下一个承诺数组将在前一个承诺数组解决后开始解决?

这不是承诺如何工作。 一旦你有了承诺,它承诺的行动已经在进行中。 你不“开始”它。

所以相反 ,你会想让array成为一个函数数组来启动有问题的进程并返回 promise,这是略有不同的:

 function get(label) { console.log(label + "- starting"); return new Promise(resolve => { setTimeout(() => { console.log(label + "- resolving"); resolve(label); }, Math.random() * 500); }); } const array = [ [ get.bind(null, "1a"), get.bind(null, "1b"), get.bind(null, "1c") ], [ get.bind(null, "2a"), get.bind(null, "2b") ], [ get.bind(null, "3a"), get.bind(null, "3b"), get.bind(null, "3c"), get.bind(null, "3d") ] ]; array.reduce( (p, subArray) => p.then(() => Promise.all(subArray.map(f => f()))), Promise.resolve() ).then(() => { console.log("All done"); }); 
 .as-console-wrapper { max-height: 100% !important; }