Javascript 异步:在回调内部的For之后获取空数组
我尝试将DB查询的结果存储在数组中,但总是得到一个空数组。我不太了解异步是如何工作的,但我认为这段代码应该可以工作,因为我在变量完成之前就存储了它 注意:下面是一个数组,我知道这个问题是因为异步行为,但我不知道如何解决它 代码: 编辑:2用户架构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 },
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异步模型(事件循环如何工作)的非常简化的解释。如何使用承诺或异步。你有阅读资料吗?注意:让我检查一下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
}
};