0

配列をループしてから、データベースにデータを書き込みたいと思います。以下のコードは、for ループを使用して非同期ではない方法で行う方法を示しています。私はこれが好ましい方法ではないことを知っています。

for(var x = 0;x < tt.matches.length;x++) //Match each player with a match and a playerId     from the tournament tree
    {
        if(tt.matches[x].p[0] !== -1)
        {
            var tmId = JSON.stringify(tt.matches[x].id);
            Player.update({ _id : grUpd.players[y] },{ tournamentMatchId : tmId, treeId : tt.matches[x].p[0], opponent : tt.matches[x].p[1] },{ safe : true }, function (err) {
                if(err)
                {
                    console.log(err);
                }
            });
            y++;
        }
        if(tt.matches[x].p[0] === -1)
        {
            byes++;

        }
        if(tt.matches[x].p[1] !== -1)
        {
            var tmId = JSON.stringify(tt.matches[x].id);
            Player.update({ _id : grUpd.players[y] },{ tournamentMatchId : tmId, treeId : tt.matches[x].p[1], opponent : tt.matches[x].p[0] },{ safe : true }, function (err) {
                if(err)
                {
                    console.log(err);
                }
            });
            y++;
        }
        if(tt.matches[x].p[1] === -1)
        {
            byes++;
        }
 }

次に、「従来の方法」で示されている次のことを実行する必要があります。

 for(var x = 0;x < plyrs.length;x++)
 {
     var nextMatch = JSON.stringify(tt.upcoming(plyrs[x].treeId)) ;
 Player.update({ _id : plyrs[x]._id },{ tournamentMatchId : nextMatch },{ safe : true }, function (err) {
        if(err)
            {
            console.log(err);
        }
    });
 }
4

1 に答える 1

1

これを行うには、開いているDB呼び出しのカウンターを保持し、すべての呼び出しが戻ったときにプログラムの次のフェーズを呼び出します。下記参照。

ただし、このアプローチには理論上の穴があります。つまり、Player.update()process.nextTickの前に呼び出しが戻った場合、完了条件が早期にトリガーされる可能性があります。

var activeCalls = 0;
for(var x = 0;x < tt.matches.length;x++) //Match each player with a match and a playerId     from the tournament tree
{
    if(tt.matches[x].p[0] !== -1)
    {
        var tmId = JSON.stringify(tt.matches[x].id);
        activeCalls++;
        Player.update({ _id : grUpd.players[y] },{ tournamentMatchId : tmId, treeId : tt.matches[x].p[0], opponent : tt.matches[x].p[1] },{ safe : true }, function (err) {
            activeCalls--;
            if(err)
            {
                console.log(err);
            }
            if ( activeCalls == 0 ) doNextThing()
        });
        y++;
    }
    if(tt.matches[x].p[0] === -1)
    {
        byes++;

    }
    if(tt.matches[x].p[1] !== -1)
    {
        var tmId = JSON.stringify(tt.matches[x].id);
        activeCalls++;
        Player.update({ _id : grUpd.players[y] },{ tournamentMatchId : tmId, treeId : tt.matches[x].p[1], opponent : tt.matches[x].p[0] },{ safe : true }, function (err) {
            activeCalls--;
            if(err)
            {
                console.log(err);
            }
            if ( activeCalls == 0 ) doNextThing()
        });
        y++;
    }
    if(tt.matches[x].p[1] === -1)
    {
        byes++;
    }
}
于 2013-02-07T16:25:10.427 に答える