3

私のデータはMongoDBにあります。開始時にスコアを更新しようとしています。ただし、ループに応じていくつかのクエリを実行する必要があります。

最後に、すべてのコールバックの連結結果を取得してから、この連結結果を使用して関数を呼び出します。

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;
}

連結されたteamScoreを取得するにはどうすればよいですか?

4

2 に答える 2

4

まだ待機している結果の数を追跡し、完了したらコールバックを呼び出します。

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));
    }
}
于 2012-08-13T16:35:38.543 に答える
3

フロー制御ライブラリを使用することで、このような多くの非同期関数を処理するときに、作業をはるかに簡単にし、コードを読みやすくすることができます。現在、私の選択したライブラリはasyncです。この場合、次を使用できます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();

結果:

$ node test.js
<Team1> 61
<Team2> 49
<Team3> 51
<Team4> 17
<Team5> 26
<Team6> 51
<Team7> 68
<Team8> 23
<Team9> 17
<Team10> 65
于 2012-08-13T16:39:53.780 に答える