2017-07-13 2 views
0

J'essaie de comprendre la bibliothèque async de node.js et de l'appliquer, mais cela ne fonctionne pas comme prévu. Appelé sont faits en parallèle quand je les attendais à être fait en série (à savoir un après l'autre)Async.eachSeries s'exécutant en parallèle

Voici mon code

 var users = [{_id:'1',username:'user1'},{_id:'2',username:'user2'}];    
     async.eachSeries(users,function function1(user,callbackEach){ 

      var username = user.username; 
      var incomes = [{source:'sourceA',provider:providerA},{source:'sourceB',provider:providerB},{source:'sourceC',provider:providerC}]; 

      async.eachSeries(incomes,function function2(income,callbackSmallEach){ 
       var source = income.source; 

       income.provider.getEarnings(user._id,username,yesterday,function callbackFromGetEarnings(err,result){ 
        if (err){ 
         // error 
        } else { 

         income.earnings = {day : new Number(result)}; 

         income.provider.getMonthEarnings(user._id,username,yesterday,function callbackFromGetMonthEarnings(err,monthTotal){ 
          if (err){ 
           // error 
          } else { 
           income.earnings.month = new Number(monthTotal); 
           callbackSmallEach(); 
          } 
         }); 

        } 
       }); 
      },    
      function sendEmails(err){ 
       if (err) { 
        // error 
       } else { 
        // send email 
       } 
      }); 

      console.log("Just before calling callbackEach()"); 
      callbackEach(); 
     }); 

getEarnings et getMonthEarnings utiliser un fournisseur externe, donc un certain temps peut se produire jusqu'à ce que Les fonctions de rappel callbackFromGetEarnings et callbackFromGetMonthEarnings sont appelées.

Mon problème est que je ne veux pas que les deux appels à getEarnings soient exécutés en parallèle. Je veux que la fonction getEarnings pour user2 soit appelée seulement après getEarnings pour user1 a renvoyé (et les rappels correspondants ont été faits).

Comme vous pouvez le voir, j'ai essayé de faire les appels pour user1 et 2 dans une série, avec async.eachSeries mais les appels sont faits en parallèle. Quand j'exécute, le journal Just before calling callbackEach() est toujours exécuté avant que la fonction de rappel callbackFromGetEarnings soit appelée ...

J'espère que c'est assez clair.

+0

callbackEach(); devrait être dans la fonction de finition de l'intérieur async.eachSeries. Dans votre code qui serait dans la fonction sendEmails – yBrodsky

Répondre

1

Le problème est l'endroit où vous appelez votre rappel. Exemple:

async.eachSeries(something, function(item, callback) { 
    async.eachSeries(item.somethingElse, function(subitem, callback2) { 
    //do something 
    return callback2(); 
    }, function() { 
    //when all item.somethingElse is done, call the upper callback 
    return callback(); 
    }) 
}, function() { 
    console.log('done'); 
}) 

De cette façon, pour chaque élément de quelque chose, vous allez exécuter en série tous les item.somethingElse, avant d'aller à l'élément suivant.