javascript - 异步: Get empty array after For inside the callback

标签 javascript node.js mongodb express mongoose

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

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

代码:

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

  for (i = 0; i < following.length; i++) { 
    User.find(following[i].followed, function (err, followUser){
    followedUser[i]= followUser;
    });
    }
    console.log(followedUser) // result empty
    res.render('following', {
      followedUser: followedUser 
    });
  };

编辑:1遵循架构

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

    follower: String,
    followed: String
});

编辑: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 },

});

注意:我正在尝试获取用户(登录)正在关注的 friend 并在 View 中显示他们。

最佳答案

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

exports.getfollowingUser = function(req, res){

    findFollowedUser(req.user.follow, function(error, followedUser) {
        console.log(followedUser);
        res.render('following', {
            followedUser: followedUser
        });
    });

    function findFollowedUser(following, callback) {
        var followedUser=[];
        var waiting  = following.length;
        var wasError = false;

        for (var i = 0; i < following.length; i++) {
            User.find(following[i].followed, function (err, followUser){
                if (wasError) {
                    return;
                }

                if (err) {
                    wasError = err;
                    return callback(err);
                }

                followedUser[i]= followUser;
                waiting--;

                if (!waiting) {
                    callback(null, followedUser);
                }
            });
        }
    }
};

另一种方法(我认为更好)是使用一些流量控制库。例如:

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

我还建议您观看this video 。这是 JavaScript 异步模型(事件循环如何工作)的非常简化的解释。

关于javascript - 异步: Get empty array after For inside the callback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27871611/

相关文章:

node.js - 在 MikroORM 中创建迁移时如何解决 EntityName.id 中的 "Please provide either ' 类型'或 'entity' 属性“错误?

node.js - node-postgres返回的error可以同时获取SQL语句吗?

Node.js 驱动程序 "mongodb"findAndModify() 的实现 - 如何指定字段?

javascript - Yii框架: get the resultant html from a view in JavaScript

javascript - 使用数据列表自动下一个焦点到日期选择器

javascript - 如何为网页上的链接设置 Accept Header?

javascript - IE 8 在 "slow"jQuery 脚本上提示用户

node.js - 函数正在循环

node.js - 如何使用mongodb(mongoose schema)创建Schema?

mongodb - 相当于 JavaScript shell 的 Object.bsonsize(doc) 的 Java 驱动程序?