异步的问题 用数组保存json数据 死活都保存不进去
发布于 10 年前 作者 CarlosRen 3981 次浏览 最后一次编辑是 8 年前
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);
})
回到顶部