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

cannot add data to array because of asynchronous nodejs

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 的异步工作,我无法获得所需的输出。请求 get 请求后数组为空,好像在 array.push(events) 范围内使用 console.log 我能够获得所需的输出。 我试图使用回调来解决这个问题,但我无法做到。我还阅读了有关承诺对象的信息。你能解释一下回调的概念并帮助我用不同的可能解决方案解决这个问题吗?我也用了settimeout函数,问题也没有解决。

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

谢谢!

不使用 promises 或异步模块的最简单命题:

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);
           }
         });
       }
     }
  });
});