在node.js中执行之前执行for循环的代码

时间:2016-06-22 02:55:55

标签: node.js asynchronous sails.js sails-mongo

这是我的代码段。我试图获取我的friends.friendsList的详细信息驻留在用户集合本身,并在那里插入用户的ID。所以首先我提取userId,然后获取他们的每个细节。但我的问题是我没有在friendsDetails之外获得fetchDetailsfunction的值。我试了很多次。我是节点和帆js的新手。我认为它的异步执行问题。我该如何解决这个问题?

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


            });
        });

1 个答案:

答案 0 :(得分:0)

正如hlozancic所说,行为与预期一致。 User.findOne查询是异步的,因此代码会在回调函数之后继续执行,因此console.log(friendsDetails)函数之外的fetchDetails会在内部任何函数之前调用。

作为解决方案,您不必使用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);
    })
}