等待网络工作者拨打http通话以结束

问题描述 投票:0回答:1

我正在创建多个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);
    });
});

我以为,这将等待每个诺言得以解决,然后再继续进行下一个项目……但不是。

我该怎么做才能使这项工作?或...我还考虑过要构建一组工作程序并运行一个递归循环,以检查/等待一个可用...我愿意接受解决此问题的一般建议。

promise async-await web-worker
1个回答
0
投票

.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);
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.