Async: cada serie con una llamada asíncrona anidada da como resultado un tamaño máximo de pila de llamadas excedido

Creado en 10 ago. 2016  ·  3Comentarios  ·  Fuente: caolan/async

¿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.

question

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) 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')
);

Todos 3 comentarios

+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')
);
¿Fue útil esta página
0 / 5 - 0 calificaciones