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.
callbackEach(); devrait être dans la fonction de finition de l'intérieur async.eachSeries. Dans votre code qui serait dans la fonction sendEmails – yBrodsky