如何为每次迭代异步调用多个异步依赖函数?
How can I call multiple asynchronous depended functions asynchronously for each iteration?
我有一些功能,
const firstResult = await firstFunction(parameters)
const secondResult = await secondFunction(firstResult)
const finalResult = await finalFunction(secondResult)
它们是异步函数,返回一些承诺。现在有一个场景,比如我有一个参数数组,在每次迭代时传递给 `firstFunction,它应该遵循相同的执行流程。像这样:
const results = arrayOfParamters.map(async parameter => {
const firstResult = await firstFunction(parameters)
const secondResult = await secondFunction(firstResult)
const finalResult = await finalFunction(secondResult)
return finalResult
})
那么我怎样才能更有效地实现这一目标呢?我可以想象的有效解决方案之一是为第一个 parameter
执行 firstFunction
,开始执行 secondFunction
,直到实现 secondFunction
的承诺,开始执行firstFunction
用于 arrayOfParameters
的下一次迭代。有什么办法可以做到这一点?如果要同步执行整个循环,似乎 Promise.all
不值得。
因为 Promise.then
将结果作为参数链接到下一个函数,您可以使用它代替 async
await
您可以这样使用 Promise.all
:
const promiseChain = arrayOfParamters.map((parameter) => firstFunction(parameter).then(secondFunction).then(finalFunction));
const results = await Promise.all(promiseChain);
您的代码已设置好执行此操作。
它将从 运行 数组元素 0 的映射代码开始。它同步调用 firstFunction
但随后它命中 await
,因此映射函数 returns 是一个承诺。这个承诺被放在 results
的元素 0 中。然后它对元素 1、然后 2 等执行相同的操作。因此它将为数组的每个元素调用 firstFunction
,并将承诺数组分配给 results
,但是 none他们中的一些人会阻止或等待。
promise 数组现已创建,因此代码继续执行此行之后的任何内容。随着时间的推移,对 firstFunction
的调用将开始结束,并且 async
函数将恢复,为数组的每个元素调用 secondFunction
(不必以完全相同的顺序,因为这是发生在不可预测的时间)。然后最终他们都会执行第三个功能,最后他们会兑现他们对 finalResult
.
的承诺
所以您的代码中唯一缺少的就是知道何时完成,为此您需要 Promise.all
:
const promises = arrayOfParamters.map(async parameter => {
const firstResult = await firstFunction(parameter)
const secondResult = await secondFunction(firstResult)
const finalResult = await finalFunction(secondResult)
return finalResult
})
const results = await Promise.all(promises)
我有一些功能,
const firstResult = await firstFunction(parameters)
const secondResult = await secondFunction(firstResult)
const finalResult = await finalFunction(secondResult)
它们是异步函数,返回一些承诺。现在有一个场景,比如我有一个参数数组,在每次迭代时传递给 `firstFunction,它应该遵循相同的执行流程。像这样:
const results = arrayOfParamters.map(async parameter => {
const firstResult = await firstFunction(parameters)
const secondResult = await secondFunction(firstResult)
const finalResult = await finalFunction(secondResult)
return finalResult
})
那么我怎样才能更有效地实现这一目标呢?我可以想象的有效解决方案之一是为第一个 parameter
执行 firstFunction
,开始执行 secondFunction
,直到实现 secondFunction
的承诺,开始执行firstFunction
用于 arrayOfParameters
的下一次迭代。有什么办法可以做到这一点?如果要同步执行整个循环,似乎 Promise.all
不值得。
因为 Promise.then
将结果作为参数链接到下一个函数,您可以使用它代替 async
await
您可以这样使用 Promise.all
:
const promiseChain = arrayOfParamters.map((parameter) => firstFunction(parameter).then(secondFunction).then(finalFunction));
const results = await Promise.all(promiseChain);
您的代码已设置好执行此操作。
它将从 运行 数组元素 0 的映射代码开始。它同步调用 firstFunction
但随后它命中 await
,因此映射函数 returns 是一个承诺。这个承诺被放在 results
的元素 0 中。然后它对元素 1、然后 2 等执行相同的操作。因此它将为数组的每个元素调用 firstFunction
,并将承诺数组分配给 results
,但是 none他们中的一些人会阻止或等待。
promise 数组现已创建,因此代码继续执行此行之后的任何内容。随着时间的推移,对 firstFunction
的调用将开始结束,并且 async
函数将恢复,为数组的每个元素调用 secondFunction
(不必以完全相同的顺序,因为这是发生在不可预测的时间)。然后最终他们都会执行第三个功能,最后他们会兑现他们对 finalResult
.
所以您的代码中唯一缺少的就是知道何时完成,为此您需要 Promise.all
:
const promises = arrayOfParamters.map(async parameter => {
const firstResult = await firstFunction(parameter)
const secondResult = await secondFunction(firstResult)
const finalResult = await finalFunction(secondResult)
return finalResult
})
const results = await Promise.all(promises)