我正在创建多个Web工作者进行http呼叫。我必须限制网络工作者的数量,因此我试图等待一些工作者完成。
这是我认为使用Promises可能起作用的示例:
anArray.map(async contact => {
await new Promise((res, rej) => {
const worker = new Worker('./http.worker', { type: 'module' });
worker.onmessage = () => {
res();
};
worker.postMessage(contact);
});
});
我以为,这将等待每个诺言得以解决,然后再继续进行下一个项目……但不是。
我该怎么做才能使这项工作?或...我还考虑过要构建一组工作程序并运行一个递归循环,以检查/等待一个可用...我愿意接受解决此问题的一般建议。
.map()
不承诺。它不会查看每次迭代的返回值来查看它是否是一个承诺,然后暂停循环。相反,它只是盲目地运行所有迭代。当您通过.map()
回调从async
返回承诺时,这仅意味着.map()
将产生一个承诺数组,并且所有循环迭代将同时在进行中。] >
[如果要迭代循环并在每次迭代中暂停循环直到承诺得以解决,请使用常规的for
循环:
async function someFunc() {
for (let contact of anArray) {
await new Promise((res, rej) => {
const worker = new Worker('./http.worker', { type: 'module' });
worker.onmessage = () => {
res();
};
worker.postMessage(contact);
});
}
}