2013-02-06 4 views
0

배열을 반복하고 데이터베이스에 데이터를 쓰려고합니다. 아래 코드는 for 루프를 사용하여 비동기 방식으로 수행하는 방법을 보여줍니다. 나는 이것이 이것을하는 선호되는 방법이 아니라는 것을 안다.node.js의 aysnc 모듈을 사용하여 두 개의 배열을 반복하는 방법

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); 
     } 
    }); 
} 
+0

어떻게 이미 잘못하고 있니? –

+0

두 번째 데이터베이스 쓰기 집합을 수행하기 전에 모든 데이터베이스 쓰기가 완료되었는지 확인해야합니다. 내가 게시 한 방법으로는 첫 번째 쓰기 작업이 완료되지 않았습니다. –

+3

을 https://github.com/caolan/async에서 살펴보고 더 깨끗하게 만들어야합니다. – supernova

답변

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++; 
    } 
} 
관련 문제