2011-04-27 4 views
3

나는 mongodb에서 가져온 객체 배열을 가지고 있습니다. 배열의 모든 요소는 작성자가 user_id 인 게시물입니다. 이제 user_id와 관련된 사용자 정보를 찾고 싶습니다.비동기 nodejs 쿼리 및 결과 처리

노드가 비동기 메소드를 사용하여 db에서 데이터를 찾기 때문에 forEach 루프는 콜백이 완료되기 전에 완료됩니다. 나는 CB (문서)를 보내는 경우

docs.forEach(function(doc, index){ 
     //get the user for this doc 
     User.find({_id: mongo.BSONPure.ObjectID(doc.user_id)}, {name: 1, username: 1, email: 1}).skip(0).limit(1).toArray(function(err, user){ 
      user = user[0] 
      if(err) { 
       throw new Error(err) 
      } else { 
       docs[index].user = user 
       if(doc.for_id) { 
        User.find({_id: mongo.BSONPure.ObjectID(doc.for_id)}, {name: 1, username: 1, email: 1}).skip(0).limit(1).toArray(function(err, for_user){ 
         for_user = for_user[0] 
         if(err) { 
          throw new Error(err) 
         } else { 
          docs[index].for_user = for_user 
         } 
        }) 
       } 
      } 
     }) 
    }) 

그래서이 루프의 끝에서, 문서는 사용자와 for_user 속성이 없습니다. 어떻게 이것을 극복 할 수 있습니까?

+0

foreach는 콜백 함수와 같은 뭔가가 현재 문서> http://www.mongodb.org/display/DOCS/Queries+and+Cursors 커서 만 하나의 매개 변수를 사용합니다. 귀하의 예에서 색인은 정의되지 않아야합니다. – neebz

+0

설명 제목이 아니기 때문에 질문의 제목을 다시 말해주십시오. – Tom

답변

2

Step for node.js을 사용하십시오. 그것은 일련 위해

var Step = require('step'); 

Step( docs.forEach(...), function() { cb(docs); }); 

에 기능을 실행 또는 레코드의 총 개수를 알고 있다면 당신은 마지막 처리를 완료하면 당신은 콜백을 호출 할 수 있습니다. 이

var count = docs.count(); // or something 
var processed = 0; 
docs.forEach(... if (++processed == count) cb(docs););