在节点js中回调forloop中的问题

时间:2016-06-21 18:42:31

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

这是我的代码段。 我试图获取我的friends.friendsList的详细信息驻留在用户集合本身,并在那里插入用户的ID。所以首先我获取userId,然后获取他们的每个细节。但我的问题是我没有在friendsDetails函数之外得到fetchDetails的值。我试了很多次。我是节点和帆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


            });
        });

2 个答案:

答案 0 :(得分:0)

您可以使用mongoDB $in子句获取朋友文档数组。

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

        User.find({id : { $in : friendsIds}}).toArray(function(err, data){
            console.log(data);

            data.forEach(function(friendObj){
                var obj={
                    id: friendObj.id,
                    name: friendObj.name,
                    pro_pic: friendObj.profile_pic 
                }
                friendsDetails.push(obj);
            });
            console.log(friendsDetails);
        });

    });
 }

答案 1 :(得分:0)

您的变量不在同一范围内。因此,它在exec函数之外为null。你是对的,这是由于javascript的异步性质。

您可以做的是将回调传递给exec函数并将变量传递给。

.exec(function(err, user, callback)

然后像这样调用它

callback(friendsDetails);

你的第二个console.log不会等到你的功能完成,因为它是异步的。