异步的问题 用数组保存json数据 死活都保存不进去
app.get('/homepage/:user',function(req,res){
var lessoninfoarray = {};
var classarray = [];
User.find({username:req.params.user},function(err,doc){
if(doc.length!=0){
UC.find({ userid:doc[0].id },function(err,docs){
if(docs.length!=0){
for(var j=0;j<docs.length;j++){
Class.findById(docs[j].classid,function(err,classinfo){
classarray.push(classinfo);
});
}
console.log("classarray is :"+classarray); // 这里是空
res.render('homepage',{title:'homepage',classinfodoc:JSON.stringify(classarray)});
}else{
res.render('homepage',{title:'homepage',classinfodoc:[]});
}
});
}else{
res.redirect('/register');
}
});
});
5 回复
for(var j=0;j<docs.length;j++){
Class.findById(docs[j].classid,function(err,classinfo){
classarray.push(classinfo);
});
}
console.log("classarray is :"+classarray); // 这里是空
哥,push是回调里执行的,这里要用async,enventproxy之类的流程控制才方便,不要受同步编程的影响
大兄弟啊 !!给个例子吧 我被折磨疯了
没例子就不明白就先了解了解javascript的异步到底是啥意思吧。要不你要例子会要疯的。
你过个5秒,在console里查看一下classarray的内容。 你现在的console.log早了点。
@CarlosRen 好难看的代码啊…
异步循环…得要用闭包方式
for(var j=0;j<docs.length;j++){
(function (index){
Class.findById(docs[index].classid,function(err,classinfo){
classarray.push(classinfo);
//判断是否填充完毕..因为是异步的,你也别指望顺序了..所以以当前的容量为准
if(classarray.length== docs.length){
/// 这里输出, 这是一个非常恶心的写法,这是作为教学.... 这种情况..建议用async...
console.log("classarray is :"+classarray); // 妥妥的有值
res.render('homepage',{title:'homepage',classinfodoc:JSON.stringify(classarray)});
}
});
})(j)
}
ps: 看完你的上下文… … 要省事用async的话… 如果用async, 要记住一点, async 约定 callback(err) ,第一个参数是用来回调错误的!!
Async.map(docs, function(item, callback) {
Class.findById(item.classid,callback);
}, function(err, classarray) {
// 中途报错的话,会立刻终止
console.log(err);
// 就是这么神奇
console.log(classarray);
})