【问题标题】:waiting for web worker making http call to finish等待进行 http 调用的网络工作者完成
【发布时间】:2020-06-12 01:11:39
【问题描述】:

我正在创建多个进行 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】:

    .map() 不知道承诺。它不会查看每次迭代的返回值是否是一个承诺,然后暂停循环。相反,它只是盲目地一个接一个地运行所有迭代。当您从 .map() 返回带有 async 回调的承诺时,这仅意味着您的 .map() 将产生一系列承诺,并且您的所有循环迭代将同时“进行中”,而不是排序。

    如果你想迭代一个循环并在每次迭代中暂停循环直到一个 promise 解决,然后使用一个常规的 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);
            });
        }
    }
    

    仅供参考,Javascript 中的 http 调用是非阻塞和异步的,因此尚不完全清楚为什么要在 WebWorkers 中执行它们。除非您对结果进行 CPU 密集型处理,否则您可以在主线程中执行 http 请求而不会阻塞它。


    另外仅供参考,对于处理数组的许多不同选项,同时只有 N 个请求在进行中(您决定 N 是什么值),请参阅这些不同的答案:

    runN(fn, limit, cnt, options):Loop through an API on multiple requests

    pMap(array, fn, limit):Make several requests to an api that can only handle 20 at a time

    rateLimitMap(array, requestsPerSec, maxInFlight, fn):Proper async method for max requests per second

    mapConcurrent(array, maxConcurrent, fn):Promise.all() consumes all my ram

    Bluebird promise libraryAsync-promises library 还内置了执行此操作的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2020-10-27
      相关资源
      最近更新 更多