2016-06-22 7 views
0

ここに私のコードスニペットです。私は私のfriends.friendsListの詳細を取得しようとしているユーザーコレクション内に存在し、そこに私はユーザーのIDを挿入しています。最初に私はuserIdを取り出して、それぞれの詳細を取得しています。しかし、私の問題はの値がfetchDetailsfunctionの外に出てこないということです。私は多くの時間をかけた。私はノードと帆jsに新しいです。私はその非同期実行の問題だと思う。どうすればこの問題を解決できますか?node.jsで実行する前にforループ内で実行されるコード

getFriendsDetails:function(req,res){ 
     var userId = req.param('id'); 
     var friendsDetails=[]; 
     User.findOne({ 
      id: userId 
     }).exec(function(err,user){ 
      var friendsIds=user.friends; 
      friendsIds.forEach(function(id){ 

       User.findOne({ 
         id: id 
        }).exec(function fetchDetails(err,Userdetails){ 

         var obj={ 
          id:Userdetails.id, 
          name:Userdetails.name, 
          pro_pic:Userdetails.profile_pic 
         } 
         friendsDetails.push(obj); 

         console.log(friendsDetails);//Here consoling pushed data correctly. 

        }); 
        console.log(friendsDetails);//here i am getting null array 


      }); 
     }); 
+0

これは正常な動作です。基礎については、ここをクリックしてください。https://www.codementor.io/nodejs/tutorial/manage-async-nodejs-callback-example-code – hlozancic

答えて

0

hlozancicが言ったように、振る舞いはまさに予想通りです。 User.findOneクエリは非同期であるため、コードはコールバック関数の後の行で引き続き実行されるため、fetchDetails関数の外側のconsole.log(friendsDetails)は、内部にあるものの前に呼び出されます。

解決策として、複数のユーザーを検索するのにfindOneを使用する必要はありません。あなたは(も使用して、組み込みの簡略化のため.then()/.catch()構文)は、このような検索基準に基づいてユーザーの配列を返す標準findを、使用することができます。

getFriendsDetails : function(req, res) { 
    var userId = req.param('id'); 
    var friendsDetails = []; 
    User.findOne({ 
     id: userId 
    }) 
    .then(function(user) { 
     var friendsIds = user.friends; 
     return User.find({ 
      id: friendsIds 
     }) 
    }) 
    .then(function(users) { 
     users.forEach(function(friend) { 
      friendsDetails.push({ 
       id: friend.id, 
       name: friend.name, 
       pro_pic: friend.profile_pic     
      }) 
     }) 
     console.log(friendsDetails); // Should log list of friend details 
    }) 
    .catch(function(err) { 
     console.log("Error!", err); 
    }) 
} 
関連する問題