Async: Каждая серия с вложенным асинхронным вызовом приводит к превышению максимального размера стека вызовов

Созданный на 10 авг. 2016  ·  3Комментарии  ·  Источник: caolan/async

Какую версию async вы используете?

2.0.1

В какой среде возникла проблема (версия узла / версия браузера)

Узел 6.2.1
NPM 3.9.3

Что ты сделал?

let counter = 2000;

async.eachSeries(
  new Array(counter),
  (item, cb) => {
    async.parallel([
      (pCb) => {
        console.log(counter--);
        pCb();
      },
    ], cb);
  },
  () => console.log('done')
);

Чего вы ожидали?

Я ожидал, что произойдет каждая из итераций, в результате чего последние два console.log будут иметь значение «1» и «готово».

Каков был реальный результат?

После менее чем 1000 итераций я получил бы эту ошибку:

RangeError: превышен максимальный размер стека вызовов

Когда я вернулся к async 1.5.2, приведенный выше код работал должным образом.

question

Самый полезный комментарий

Причина, по которой это работало в async 1.5.2, заключается в том, что мы гарантируем, что обратный вызов всегда вызывается асинхронно в этой версии. В версии 2 мы удалили эту защиту (см. Https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)

Итак, в вашем случае для исправления скрипта вы можете использовать async.ensureAsync(cb) или async.setImmediate(cb) чтобы обойти проблему рекурсии:

var counter = 2000;

async.eachSeries(
  new Array(counter),
  (item, cb) => {
    async.parallel([
      (pCb) => {
        console.log(counter--);
        async.setImmediate(pCb);
      },
    ], cb);
  },
  () => console.log('done')
);

Все 3 Комментарий

+1

+1

Причина, по которой это работало в async 1.5.2, заключается в том, что мы гарантируем, что обратный вызов всегда вызывается асинхронно в этой версии. В версии 2 мы удалили эту защиту (см. Https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)

Итак, в вашем случае для исправления скрипта вы можете использовать async.ensureAsync(cb) или async.setImmediate(cb) чтобы обойти проблему рекурсии:

var counter = 2000;

async.eachSeries(
  new Array(counter),
  (item, cb) => {
    async.parallel([
      (pCb) => {
        console.log(counter--);
        async.setImmediate(pCb);
      },
    ], cb);
  },
  () => console.log('done')
);
Была ли эта страница полезной?
0 / 5 - 0 рейтинги