node.js for循环遇到数据库查询后回调操作 怎样将循环体内值传出
var admin_id = new Array ;
for(var i = 0 ;i <admin.length ; i++ )
{
UserModel.find({username:admin[i]},function(err,doc){
admin_id[i] = doc[0]._id;
console.log('+======'+admin_id); //打印1
});
}
console.log('+======'+admin_id);//打印2
打印1处可以正常打印数组的内容; 打印2处的内容总是为空。 请问怎样将数组的内容传出循环体外?
8 回复
可参考使用 eventproxy 的 after 方法。
var howdo = require('howdo');
var admin = [1, 3, 11, 19, 33];
howdo.each(function(index, val, done) {
UserModel.find({
username: val
}).exec(done);
}).together(function(err) {
// 参数分别是:err, ret1, ret3, ret11, ret19, ret33
// 出错判断
if (err) {
return err;
}
// 这里是结果数组
var ret = [].slice.call(arguments, 1);
});
可以试试 async 这是async的each用法,有中文注释喔~ https://github.com/bsspirit/async_demo/blob/master/each.js
是不是因为for会异步去执行, 然后先执行了 console.log(’+======’+admin_id); 所以内容是空的 我遇到了同样的问题… 求解答啊
用回调函数传递一下:
var admin_id = new Array ;
for(var i = 0 ;i <admin.length ; i++ )
{
UserModel.find({username:admin[i]},function(err,doc){
admin_id[i] = doc[0]._id;
console.log('+======'+admin_id); //打印1
callMeBack(admin_id);
});
}
function callMeBack(admin_id) {
console.log('+======'+admin_id);//打印2
}
。。。回调。。。看下Q.all()
@mcdongWang 是需要回调一下 或者用push 在for外面 var list= [] 在打印1 后面 用 list.push(doc[0]._id);
楼主这最好是用回调函数传递一下