Какую версию 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, приведенный выше код работал должным образом.
+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')
);
Самый полезный комментарий
Причина, по которой это работало в async 1.5.2, заключается в том, что мы гарантируем, что обратный вызов всегда вызывается асинхронно в этой версии. В версии 2 мы удалили эту защиту (см. Https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)
Итак, в вашем случае для исправления скрипта вы можете использовать
async.ensureAsync(cb)
илиasync.setImmediate(cb)
чтобы обойти проблему рекурсии: