【问题标题】:How can I invoke callback style functions concurrently? [duplicate]如何同时调用回调样式函数? [复制]
【发布时间】:2021-12-30 16:24:59
【问题描述】:

(A prior version of this question 被关闭作为如何在循环中调用异步函数的重复。这个版本明确指出函数不是异步的)

我有几个无法修改的回调样式函数。仅更改 ABC 函数,如何以与 D 变量中存在的函数相同的顺序获得输出。我尝试使用 async-await,但由于超时事件,输出为 ['123', 'ankit', '345']。

https://jsfiddle.net/ankitg1602/unrxv3k6

const A = (dev) => {
  setTimeout(() => {
    dev('ankit')
  }, 300)
}

const B = (dev) => {
  setTimeout(() => {
    dev('123')
  }, 50)
}

const C = (dev) => {
  setTimeout(() => {
    dev('345')
  }, 500)
}

const D = [A, B, C]

const ABC = (args, dev) => {
  // write your code here
  Promise.all(D.map(async (fun1) => {
    return await fun1(dev)
  }))
}

ABC(D, (result) => {
   console.log('result:', result) // ['ankit', 123, 345]
})

【问题讨论】:

  • 需要将resolve函数传递给A
  • 虽然我有点同意你最后一个问题的副本不太准确,但至少自愿提及情况会更开放(人们可以看到已经发布的内容)。
  • ABC 的任何函数都不会返回承诺,因此除非您通过例如来自 Promise 构造函数的 resolve 回调(您没有),await 没有任何内容。
  • @DanielA.White jsfiddle.net/ankitg1602/unrxv3k6 如果您知道答案,请编辑并分享答案。
  • 使用@ASDFGerte 的建议进行编辑,以明确与未能阐明核心问题的先前问题的关系。

标签: javascript arrays asynchronous async-await


【解决方案1】:

这个想法是promisify回调风格的函数。下面,为每个在函数调用其回调时解析的 Promise 创建一个。

映射promisfy 以生成异步函数数组。调用它们中的每一个来收集一组 Promise,然后使用 Promse.all() 同时解决 Promise

const A = (dev) => {
  setTimeout(() => {
    dev('ankit')
  }, 300)
}

const B = (dev) => {
  setTimeout(() => {
    dev('123')
  }, 50)
}

const C = (dev) => {
  setTimeout(() => {
    dev('345')
  }, 500)
}

const D = [A, B, C]

const ABC = async(args, dev) => {
  const promisify = fn => () => new Promise(resolve => fn(resolve));
  const promises = args.map(fn => promisify(fn)());
  Promise.all(promises).then(dev)
}

ABC(D, (result) => {
  console.log('result:', result) // ['ankit', 123, 345]
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多