由于异步nodejs,无法将数据添加到数组

时间:2015-11-07 12:53:15

标签: node.js asynchronous callback synchronous

api.get('/getfavourites',function(req,res) {


    var userid = req.param('userid');
    array = [];


    User.findById({_id: userid}, function (err, users) {
        if (err) {
            res.send(err);
            return;
        }
        else {



            var i;
            var length = users.favouriteid.length;


            for (i = 0; i < length; i++) {


                var temp = {eid: users.favouriteid[i].eventid};


                Event.findById({_id: temp.eid}, function (err,events) {
                    if (err) {
                        res.send(err);
                        return;
                    }
                    else {

                        array.push(events);


                    }
                });

            }

        }

    });

    console.log(array);

    res.json(array);

});

由于nodejs的异步工作,我无法获得所需的输出。请求获取请求后数组为空,并且在array.push(events)范围内使用console.log,我可以获得所需的输出。 我试图使用回调来解决这个问题,但我无法解决。我还读到了关于promise对象的内容。你可以解释回调的概念,并帮助我用不同的可能解决方案解决这个问题。我也使用了settimeout函数,问题也没有解决。

如何使用回调返回数据以及如何使用它们

谢谢!

1 个答案:

答案 0 :(得分:1)

最简单的命题,不使用promises或async模块:

api.get('/getfavourites',function(req,res) {
  var userid = req.param('userid');
  array = [];
  User.findById({_id: userid}, function (err, users) {
    if (err) {
      res.send(err);
      return;
     }
     else {
       var i;
       var length = users.favouriteid.length;
       for (i = 0; i < length; i++) {
         var temp = {eid: users.favouriteid[i].eventid};
         Event.findById({_id: temp.eid}, function (err,events) {
           if (err) {
             res.send(err);
             return;
           }
           else {
             array.push(events);
           }
           if(array.length === length){//it is true when all events are pushed
             console.log(array);
             res.json(array);
           }
         });
       }
     }
  });
});