web-dev-qa-db-fra.com

async.eachSeries dans node.js

J'ai une boucle dans node.js

for (var i in files){
    var all = fs.readdirsync("./0");
    async.eachSeries(all, function(item){
        check(item); 
   }
}

La check(item) a un rappel vers une autre fonction.

Comme je peux le voir, le async.eachSeries Ne s'exécute pas de manière synchrone. La boucle continue d'exécuter les autres éléments, avant la fin du rappel dans la fonction check().

Comment faire attendre la boucle jusqu'à la fin de l'itération (y compris le rappel)?

11
Or Smith

En supposant que check accepte un rappel, nous pouvons utiliser mapSeries pour y parvenir.

async.mapSeries(files, function(file, outerCB) {
  var all = fs.readdirsync("./0");
  async.mapSeries(all, function(item, cb){
      check(item, cb);
  }, outerCB);
}, function(err, results) {
  // This is called when everything's done
});
8
SomeKittens

La boucle externe doit également être asynchrone. L'une des méthodes consiste à utiliser 2 boucles eachSeries ou la boucle externe peut être en parallèle (chacune) si les fichiers n'ont pas à être traités en série:

var async = require('async');

async.eachSeries(files, function(file, outCb) 
{
  var all = fs.readFileSync(file);

  async.eachSeries(all, function(item, inCb) 
  {
    check(item);
    inCb(null);  // inner callback
  }, 
  function(err) 
  {
    outCb(null);  // outer callback
  });
},
function(err) 
{
  console.log('all done!!!');
});
6
Ben