【问题标题】:How can I call multiple asynchronous depended functions asynchronously for each iteration?如何为每次迭代异步调用多个异步依赖函数?
【发布时间】:2021-12-05 13:24:14
【问题描述】:

我有一些功能,

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 将不值得。

【问题讨论】:

  • 检查this
  • 您有什么证据表明当前代码效率低下?你看到缓慢了吗?这对我来说似乎是过早的优化。
  • @ZloiGoroh 是的,明白了。 allSettled 更适合我的用例。谢谢!
  • @HereticMonkey 这是过早的优化。我很好奇有什么方法可以进一步优化。对不起

标签: javascript node.js asynchronous promise


【解决方案1】:

您的代码已经设置为执行此操作。

首先运行数组元素 0 的映射代码。它同步调用firstFunction,但随后遇到await,因此映射函数返回一个promise。这个承诺被放入results 的元素 0 中。然后它对元素 1、2 等执行相同的操作。因此它将为数组的每个元素调用 firstFunction,并将一个 Promise 数组分配给 results,但它们都不会阻塞或等待。

现在已经创建了 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)

【讨论】:

  • 有道理,所以如果可以进一步优化我就错了。
【解决方案2】:

因为Promise.then 将结果作为参数链接到下一个函数,您可以使用它而不是async await

你可以像这样使用Promise.all

const promiseChain = arrayOfParamters.map((parameter) => firstFunction(parameter).then(secondFunction).then(finalFunction));
const results = await Promise.all(promiseChain);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2017-06-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多