gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:44 25 4
gpt4 key购买 nike

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

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

代码:

    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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com