如何并行运行异步函数?

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

一个 nodeJS 脚本。我有一个功能:

async myFunc1(a, b, c) {
  //.......
}

返回一些值但不返回

Promise
。我曾经这样运行它:

 let a1 = await myFunc1(1, "fds", 99);

现在我需要同时运行几十个,并且它们的数量和参数的输入来自用户。

let lines = readDataFromUserProvidedFile();
for (let i = 0; i < lines; i++) {
    //
    //how to run all the myFunc1(...) in parallel??
    //and then print out a result of each?


    //(?)
    myFunc1(lines[i], i, i*2);
}

我将如何以这种方式并行运行它们?当后续一个返回结果时,我想立即打印它。


对于函数,返回值大约需要 10 分钟。它不进行计算,它等待来自远程网络服务的结果。

javascript node.js asynchronous async-await
2个回答
2
投票

您可以创建一个将并行执行的承诺集合,然后在该集合上迭代等待:

伪代码:

let lines = readDataFromUserProvidedFile();

const promises = lines.map((line, index) => myFunc1(line, index, index * 2));

// await the resolution of all promises and print the results as they become available
for await (const result of promises) {
  console.log(result);
}

1
投票

所以,promise 有两部分。处决他们,等待他们。等待它们意味着您正在附加回调以在获得结果时执行某些操作。执行它们意味着只是“踢掉它们”

你的问题是你正在使用

await
。启动异步过程和等待异步过程的结果是不同的。

tl;dr 你仍然可以使用

async/await
,只需立即使用
.map
:

开始所有的承诺
const myFuncToBeCalled = async () => {

   let lines = readDataFromUserProvidedFile();
   const promises = Array.from({length:lines}).map(async (_,i) => {
      try {
         const result = await myFunc1(lines[i], i, i*2);
         console.log(`got result for line ${i}`,result)
         return result
      } catch(err) {
         console.log(`got an error for line ${i}`, err)
      }
   })

   const arrayOfResults = await Promise.all(promises)
   return arrayOfResults


}
© www.soinside.com 2019 - 2024. All rights reserved.