遍历需要异步处理的数组元素的最有效方法

Most efficient way to loop through array elements that need to be processed asynchronously

我有 3 个异步函数。第一个的输出是第二个的输入。前两个的输出是第三个的输入。现在这 3 个将在一个循环内,具体取决于我的数组的长度。什么是遍历数组并以前两个函数的输出仍然相互连接的方式快速执行函数的有效方法?意思是,它们必须与数组具有相同的长度,并且它们的索引彼此成对。请注意,输出不需要按顺序排列,第一个数组的 ith 元素只需要与第二个数组的 ith 元素配对即可。

例如:

let firstFunctionOutput = [];
let secondFunctionOutput = [];
let thirdFunctionInput = [];
// arr.length = 10,000
// at the end, firstFunctionOutput and secondFunctionOutput should have length = 10,000 as well
for (i < 0; i < arr.length; i++) {
  firstFunctionOutput.push(await firstFunction(arr[i]));
  secondFunctionOutput.push(await secondFunction(arr[i], firstFunctionOutput[i]));
  thirdFunctionInput.push(firstFunctionOutput[i], secondFunctionOutput[i]);
}
await thirdFunction(thirdFunctionInput);

我只是觉得这太慢了,因为我们正在迭代并且 await 太多了。任何建议将不胜感激。

鉴于上面的代码被截断,thirdFunction 需要 firstFunctionsecondFunction 的所有输出,但它们的调用可以并行进行。

因此,如果第一个和第二个函数的每次执行都需要一秒钟,那么第三个函数可以在大约 2 秒内执行

  const firstAndSecond = async (arri) => {
    const output = await firstFunction(arri)
    return [output, await secondFunction(arri, output)]
  }
  thirdFunctionInput = (await Promise.all(arr.map(firstAndSecond))).flat()
  return await thirdFunction(thirdFunctionInput);

TS playground