【问题标题】:Call back issue in forloop in node js节点js中for循环中的回调问题
【发布时间】:2016-06-21 18:42:30
【问题描述】:

这是我的代码 sn-p。 我正在尝试获取我的friends.friendsList 的详细信息,它位于用户集合本身中,并且我正在插入用户的ID。所以首先我要获取用户 ID,然后获取他们的每个详细信息。但我的问题是我没有在 fetchDetails 函数之外获取 friendsDetails 的值。我试过很多次。我是节点新手,并且会航行 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


            });
        });

【问题讨论】:

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


    【解决方案1】:

    您可以使用 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);
            });
    
        });
     }
    

    【讨论】:

    • 遇到错误 \sails-mongo\node_modules\mongodb\lib\utils.js:98 process.nextTick(function() { throw err; }); ^ TypeError: undefined is not a function
    【解决方案2】:

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

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

    .exec(function(err, user, callback)
    

    然后这样称呼它

    callback(friendsDetails);
    

    您的第二个 console.log 不会等到您的函数完成,因为它是异步的。

    【讨论】:

    • 能否请您给出明确的想法..我对node js很陌生
    猜你喜欢
    • 2018-12-27
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多