CNode

node.js for循环遇到数据库查询后回调操作 怎样将循环体内值传出

问答
Kkingche发布于12 年前最后回复12 年前8 回复15023 浏览0 收藏
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)

C
cloudcome#1·12 年前
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);
});
H
haiyang5253#2·12 年前

可以试试 async 这是async的each用法,有中文注释喔~ https://github.com/bsspirit/async_demo/blob/master/each.js

M
mcdongWang#3·12 年前

是不是因为for会异步去执行, 然后先执行了 console.log('+======'+admin_id); 所以内容是空的 我遇到了同样的问题.. 求解答啊

L
leapon#4·12 年前

用回调函数传递一下:

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
 }
V
violet-day#5·12 年前

。。。回调。。。看下Q.all()

S
sayfly#7·12 年前
引用 mcdongWang是不是因为for会异步去执行, 然后先执行了 console.log('+======'+admin id); 所以内容是空的 我遇到了同样的问题.. 求解答啊

@mcdongWang 是需要回调一下 或者用push 在for外面 var list= [] 在打印1 后面 用 list.push(doc[0]._id);
楼主这最好是用回调函数传递一下

L
lgyhitler#8·12 年前

可参考使用 eventproxy 的 after 方法。

参与回复
登录后即可参与回复。登录