如何迭代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; }