¿Qué versión de async estás usando?
2.0.1
¿En qué entorno ocurrió el problema (versión de nodo / versión del navegador)?
Nodo 6.2.1
NPM 3.9.3
¿Qué hiciste?
let counter = 2000;
async.eachSeries(
new Array(counter),
(item, cb) => {
async.parallel([
(pCb) => {
console.log(counter--);
pCb();
},
], cb);
},
() => console.log('done')
);
Qué esperabas que sucediera?
Esperaba que ocurriera cada una de las iteraciones, lo que daría como resultado que los dos últimos console.log fueran '1' y 'listo'.
¿Cuál fue el resultado real?
Después de menos de 1000 iteraciones, recibiría este error:
RangeError: se excedió el tamaño máximo de la pila de llamadas
Cuando volví a async 1.5.2, el código anterior funcionó como se esperaba.
+1
+1
La razón por la que esto funcionó en async 1.5.2 es que nos aseguramos de que la devolución de llamada siempre se llamara de forma asincrónica en esa versión. En la versión 2 eliminamos esta protección (ver https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)
Entonces, en su caso, para arreglar el script, puede usar async.ensureAsync(cb)
o async.setImmediate(cb)
para solucionar el problema de la recursividad:
var counter = 2000;
async.eachSeries(
new Array(counter),
(item, cb) => {
async.parallel([
(pCb) => {
console.log(counter--);
async.setImmediate(pCb);
},
], cb);
},
() => console.log('done')
);
Comentario más útil
La razón por la que esto funcionó en async 1.5.2 es que nos aseguramos de que la devolución de llamada siempre se llamara de forma asincrónica en esa versión. En la versión 2 eliminamos esta protección (ver https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)
Entonces, en su caso, para arreglar el script, puede usar
async.ensureAsync(cb)
oasync.setImmediate(cb)
para solucionar el problema de la recursividad: