Javascript 异步:在回调内部的For之后获取空数组

Javascript 异步:在回调内部的For之后获取空数组,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我尝试将DB查询的结果存储在数组中,但总是得到一个空数组。我不太了解异步是如何工作的,但我认为这段代码应该可以工作,因为我在变量完成之前就存储了它 注意:下面是一个数组,我知道这个问题是因为异步行为,但我不知道如何解决它 代码: 编辑:2用户架构 module.exports = mongoose.model('User',{ email:{ type: String, unique: true, lowercase: true },

我尝试将DB查询的结果存储在数组中,但总是得到一个空数组。我不太了解异步是如何工作的,但我认为这段代码应该可以工作,因为我在变量完成之前就存储了它

注意:下面是一个数组,我知道这个问题是因为异步行为,但我不知道如何解决它

代码:

编辑:2用户架构

module.exports = mongoose.model('User',{

    email:{
        type: String,
        unique: true,
        lowercase: true },

    password:String,

    profile:{
        fullname: String,
        gender: String,
        role: {type: String, default: 'Autorizado'},
        country: String },

});

注意:我正在尝试获取用户(登录名)关注的朋友,并在视图中显示他们。

查看执行流程:

exports.getfollowingUser = function(req, res){
    followedUser=[];                                                  // 1
    following = req.user.follow;

    for (i = 0; i < following.length; i++) {                          
        User.find(following[i].followed, function (err, followUser){  // 2,3,4
            followedUser[i]= followUser;                              // 7,8,9
        });
    }
    console.log(followedUser) // result empty                         // 5
    res.render('following', {followedUser: followedUser});            // 6
};
这里的语句与[7,8,9]之后执行的语句相同,但在
allDone()
[11,12]内

这只是为了解释,有更好的库来处理以下内容:

  • 异步:
  • 承诺:

还有帮助:

在for循环
节点中
只需向数据库发出请求并继续处理。它不等待来自数据库的结果。这就是异步的工作原理。因此,在for循环之后,
节点
尚未从DB接收结果,
followedUser
为空。要在没有第三方库的情况下修复此问题,您可以执行以下操作:

exports.getFollowUser=函数(req,res){
FindFollowDuser(req.user.follow,函数(错误,FollowDuser){
控制台日志(followedUser);
res.render('following'{
followedUser:followedUser
});
});
函数findFollowDuser(以下为回调){
var followedUser=[];
var waiting=following.length;
var wasError=false;
对于(变量i=0;i
另一种方法(我认为更好)是使用一些流控制库。例如:

我个人偏好:-极快实现承诺。实际上,承诺是即将到来的javascript标准。所以我建议你仔细看看


我也建议你去看。这是对javascript异步模型(事件循环如何工作)的非常简化的解释。

如何使用承诺或异步。你有阅读资料吗?注意:让我检查一下code@jose-奥索里奥(不客气)。我也忘了:看
module.exports = mongoose.model('User',{

    email:{
        type: String,
        unique: true,
        lowercase: true },

    password:String,

    profile:{
        fullname: String,
        gender: String,
        role: {type: String, default: 'Autorizado'},
        country: String },

});
exports.getfollowingUser = function(req, res){
    followedUser=[];                                                  // 1
    following = req.user.follow;

    for (i = 0; i < following.length; i++) {                          
        User.find(following[i].followed, function (err, followUser){  // 2,3,4
            followedUser[i]= followUser;                              // 7,8,9
        });
    }
    console.log(followedUser) // result empty                         // 5
    res.render('following', {followedUser: followedUser});            // 6
};
exports.getfollowingUser = function(req, res){
    followedUser=[];                                                  // 1
    following = req.user.follow;

    var counter = 0;
    var length = following.length;

    for (i = 0; i < following.length; i++) {                          
        User.find(following[i].followed, function (err, followUser){  // 2,3,4
            followedUser[i]= followUser;                              // 7,8,9
            counter++;
            if(counter>=length) allDone();                            // 10
        });
    }

    console.log(followedUser) // result empty                         // 5
    res.render('following', {followedUser: followedUser});            // 6        

    function allDone(){
        console.log(followedUser) // result empty                     // 11
        res.render('following', {followedUser: followedUser});        // 12       
    }
};