node.js for循环遇到数据库查询后回调操作 怎样将循环体内值传出
发布于 5个月前 作者 kingche 705 次浏览 来自 问答
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);
楼主这最好是用回调函数传递一下

回到顶部