Параллельная обработка очереди асинхронных / ожидающих функций - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь обработать очередь параллельно. У меня есть массив объектов, и мне нужно применить функцию 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, когда очередь пуста, поэтому ее нет.

Как с этим справиться?

1 Ответ

0 голосов
/ 01 мая 2018

Оказалось, это было достаточно просто:

  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()
                })
            })
  }
...