2016-06-22 75 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); 
    }) 
}