Retourner la concaténation des rappels résultant appelée dans une boucle

Mes données sont dans MongoDB. J'essaie de mettre à jour le score lorsqu'il est lancé. Cependant, je dois faire plusieurs requêtes en fonction de la boucle.

À la fin, j'aimerais obtenir les résultats concaténés de tous les rappels, puis appeler une fonction avec ce résultat de concaténation.

function getCurrentScore() { var teamScores = ""; (function(){ for(var i=0 ; i< teams.length; i++) { (function(i){ PingVoteModel.count({"votedTo": "TEAM"+(i+1)}, function( err, count) { teamScores += "<Team" + (i+1) + "> " + count + "\t"; }); }(i)); } }()); return teamScores; } 

Comment puis-je obtenir un TeamScore concaténé?

Faites le suivi de combien de résultats vous attendez et appelez un rappel lorsque vous avez terminé:

 function getCurrentScore(callback) { var teamScores = "", teamsLeft = teams.length; for(var i=0 ; i<teams.length; i++) { (function(i){ PingVoteModel.count({"votedTo": "TEAM"+(i+1)}, function( err, count) { teamScores += "<Team" + (i+1) + "> " + count + "\t"; if (--teamsLeft === 0) { callback(teamScores); } }); }(i)); } } 

Vous pouvez rendre votre vie beaucoup plus facile et rendre votre code plus facile à lire lorsqu'il s'agit de nombreuses fonctions asynchrones comme celle-ci en utilisant une bibliothèque de contrôle de flux; Actuellement, ma bibliothèque de choix est asynchrone . Dans ce cas, vous pouvez utiliser la map :

 // Stub out some data PingVoteModel = { count: function(options, callback) { callback(null, Math.floor(Math.random() * 100)); } }; teams = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // Now for the real stuff var async = require('async'); function getCurrentScore() { var iterator = function(team, callback) { PingVoteModel.count({"votedTo": "TEAM" + team}, function(err, count) { callback(null, "<Team" + team + "> " + count); }); }; async.map(teams, iterator, function(err, results) { console.log(results.join("\n")); }); } getCurrentScore(); 

Résultats:

 $ node test.js <Team1> 61 <Team2> 49 <Team3> 51 <Team4> 17 <Team5> 26 <Team6> 51 <Team7> 68 <Team8> 23 <Team9> 17 <Team10> 65