2016-06-22 117 views
0

這裏是我的代碼片段。我正在嘗試獲取我的friends.friendsList的詳細信息,它駐留在用戶集合本身中,並且在那裏插入用戶的ID。所以首先我拿取userId,然後提取他們的每一個細節。但我的問題是我沒有得到friendsDetailsfetchDetailsfunction之外的值。我嘗試了很多次。我是新來的節點和帆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來搜索多個用戶;你可以使用一個標準的find返回根據搜索條件的用戶的數組,像這樣的(也使用內置.then()/.catch()語法爲簡單起見):

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