【问题标题】:Parallel processing of async/await functions queue异步/等待函数队列的并行处理
【发布时间】:2018-05-01 15:47:14
【问题描述】:

我正在尝试并行处理一个队列。我有一个对象数组,我需要将函数func 并行应用于每个元素。我正在使链的并行级别如下:

async function() {
  const pickUpNextTask = () => {
    if (this.internalQueue.length) {
      return this.func(this.internalQueue.shift())
    }
  }
  const startChain = () => {
    return Promise.resolve().then(function next() {
      console.log('before then(next)')
      return pickUpNextTask().then(next)
    })
  }
  let chains = []
  for (let k = 0; k < this.parallelism; k += 1) {
    chains.push(startChain())
  }
  await Promise.all(chains)
  this.drain()
}

它没有像我想要的那样工作。当队列为空时,pickUpNextTask() 最终返回undefined,因此没有 then。

如何处理这个问题?

【问题讨论】:

  • pickUpNextTask 没有带有return 语句的else。那么它实际上不是返回undefined 吗?
  • 好点。它是undefined。谢谢。
  • 您的代码看起来像是在尝试对队列中的事物进行排序,而不是在第一个项目完成之前执行第二个项目。但是,你的问题说你想要并行处理。你真正想要哪个?
  • @jfriend00 请注意我有this.parallelismqueues 数字,如倍数。

标签: javascript async-await es6-promise


【解决方案1】:

事实证明,这很容易:

  const pickUpNextTask = () => {
    if (this.internalQueue.length) {
      return this.func(this.internalQueue.shift())
    } else {
      return Promise.reject()
    }
  }
  const startChain = () => {
    return Promise.resolve()
            .then(function next() {
              return pickUpNextTask()
                .then(next)
                .catch(() => {
                  return Promise.resolve()
                })
            })
  }

【讨论】:

  • 为什么要使用 promise 拒绝来检测链的末端?而是将if/else 放在next 函数中。
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2022-01-02
  • 2021-11-01
  • 2022-10-08
相关资源
最近更新 更多