【问题标题】:Calling asynchronous functions from an array [duplicate]从数组调用异步函数[重复]
【发布时间】:2023-03-25 20:50:02
【问题描述】:

PromisesInSeries 函数,它接受一组异步函数并按顺序(下一个在前一个完成时开始)调用它们,并将调用前一个函数的结果作为参数传递

function promisesInSeries(asyncFns) {
    let result;
    return new Promise((resolve, reject) => {
        for(const fn of asyncFns){
            resolve(fn)
            .then(data => fn(data))
        }
    })
}

我只得到第一个函数的结果。如何调用数组中的所有函数并返回最后一个值?

【问题讨论】:

  • 我不确定,但如果这可能,我认为您需要返回一组承诺,而不是带有一组调用的承诺。这是因为每个函数都是异步的,所以每个都需要一个关联的promise。
  • 全部使用承诺

标签: javascript asynchronous promise


【解决方案1】:

没有async/await 你可以reduce fns 数组:

function promisesInSeries(fns) {
  return fns.reduce((promise, fn) => promise.then(fn), Promise.resolve());
}

第一个fn 将收到undefined 的值,然后将每个返回值传递给下一个函数。

如果你想有一些初始值,你可以通过将Promise.resolve()更改为Promise.resolve(initialData)来提供它。其中initialData 可以是静态值,也可以是通过函数参数传递的值。

【讨论】:

  • 是的。谢谢
【解决方案2】:

如果你可以使用 async-await,那就更简单了:

async function promisesInSeries(asyncFns) {
    let result;
    for (const fn of asyncFns) {
      result = await fn(result);
    }
}

【讨论】:

  • 您忘记将数据从一个函数传递到另一个函数。
  • @Evert 不可能没有异步等待?
  • 我试图用我认为你想要的来重写它。没有 async/await 当然可以,但我将其作为一个有效的解决方案分享,这可能是最易读的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多