Nodo de anidamiento async.eachSeries
He estado luchando con el módulo asíncrono durante medio día, pero no puedo hacer que funcione correctamente cuando anida pocos niveles.
Entonces esto funciona bien:
var async = require('async') var myarr = ["Outer - A", "Outer - B"]; var myarr2 = ["Inner - A", "Inner - B"]; var innerComplete = true; async.eachSeries(myarr, function( item, outerCallback) { console.log('Processing item ' + item); async.series([ function(callback) { takeTime(2000, item, callback) }, function(callback) { takeTime(1000, item, callback) }, function(callback) { outerCallback(); } ], function(err) { console.log("---OUTER SEQUENCE---") }) }, function(err){ console.log("---OUTER LOOP---") }); function takeTime(ms, msg, callback) { console.log("Starting " + ms + " ms task from " + msg); setTimeout( function() { console.log("Finished " + ms + " ms task from " + msg); callback(); }, ms); }
Y genera todo muy bien en secuencia como esta:
Processing item Outer - A Starting 2000 ms task from Outer - A Finished 2000 ms task from Outer - A Starting 1000 ms task from Outer - A Finished 1000 ms task from Outer - A Processing item Outer - B Starting 2000 ms task from Outer - B Finished 2000 ms task from Outer - B Starting 1000 ms task from Outer - B Finished 1000 ms task from Outer - B ---OUTER LOOP---
Pero cuando trato de anidar otro, cada serie se enlaza así:
var async = require('async') var myarr = ["Outer - A", "Outer - B"]; var myarr2 = ["Inner - A", "Inner - B"]; var innerComplete = true; async.eachSeries(myarr, function( item, outerCallback) { console.log('Processing item ' + item); async.series([ function(callback) { takeTime(2000, item, callback) }, function(callback) { takeTime(1000, item, callback) }, function(callback) { async.eachSeries(myarr2, function( item2, outerCallback2) { console.log('Processing item ' + item2); async.series([ function(callback2) { takeTime(2000, item2, callback2) }, function(callback2) { takeTime(1000, item2, callback2) } ], function(err) { console.log('---INNER SEQUENCE---') }) }, function(err){ console.log("---INNER LOOP---") }); outerCallback(); } ], function(err) { console.log("---OUTER SEQUENCE---") }) }, function(err){ console.log("---OUTER LOOP---") }); function takeTime(ms, msg, callback) { console.log("Starting " + ms + " ms task from " + msg); setTimeout( function() { console.log("Finished " + ms + " ms task from " + msg); callback(); }, ms); }
Pierde el orden de ejecución al ingresar el segundo ciclo eachSeries de esta manera:
Processing item Outer - A Starting 2000 ms task from Outer - A Finished 2000 ms task from Outer - A Starting 1000 ms task from Outer - A Finished 1000 ms task from Outer - A Processing item Inner - A Starting 2000 ms task from Inner - A Processing item Outer - B Starting 2000 ms task from Outer - B Finished 2000 ms task from Inner - A Starting 1000 ms task from Inner - A Finished 2000 ms task from Outer - B Starting 1000 ms task from Outer - B Finished 1000 ms task from Inner - A ---INNER SEQUENCE--- Finished 1000 ms task from Outer - B Processing item Inner - A Starting 2000 ms task from Inner - A ---OUTER LOOP--- Finished 2000 ms task from Inner - A Starting 1000 ms task from Inner - A Finished 1000 ms task from Inner - A ---INNER SEQUENCE---
También probé cascada, mapSeries, etc., pero con la misma secuencia de ejecución o de otra manera desordenada. ¿Estoy haciendo algo mal o el módulo asíncrono no admite ese anidamiento?