NodeJS V8将附加参数传递给回调

时间:2013-12-01 19:59:12

标签: node.js callback mongoose

我使用NodeJS,ExpressJS,MongoDB(使用Mongoose)编写应用程序......

一切都很完美,但是,当我有一个获取记录的循环并对结果做一些事情时,就像这样:

for(var i = 0; i < 10; i++) {
   recods.findOne({number: i}, function(err,doc){
        ...
   });
}

回调函数范围内的变量“i”通过引用传递,结果不是所需的。

当调用回调时,循环已经运行并且变量已经改变。

如果我尝试将参数作为匿名函数传递,则不起作用,因为它替换了所需的参数:

for(var i = 0; i < 10; i++) {
   records.findOne({number: i}, (function(err,doc){
        ...
   })(i));
}

通过这种方式,我失去了“错误,文档”的论点,

我可以做些什么来解决这个大问题?

3 个答案:

答案 0 :(得分:1)

您在错误的位置应用匿名函数。它应该在使用i的函数之外应用,而不是应用于回调函数。

for (var i = 0; i < 10; i++) {
  (function(i) {
    records.findOne({number: i}, function(err, doc) {
      ...
    });
  }(i));
}

答案 1 :(得分:1)

您可以将其绑定到回调以创建部分函数,​​并将其第一个参数设置为i

for (var i = 0; i < 10; i++) {
  records.findOne({number: i}, function(i, err, doc) {
    ...
  }.bind(records, i));
}

答案 2 :(得分:0)

虽然通过一些简单的修复来捕获闭包中i的值,但是如其他答案所示,您也可以考虑以不同且可能更有效的方式使用Mongoose:

var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
records.find( { number : { $in : numbers } }, function(err, allDocs) {
    if (err) { throw err; }
    // allDocs are now available in an array (they aren't ordered)
    // allDocs.length
    // allDocs[0].number ...
});

使用$in运算符(reference)只需调用一次数据库,找到所有匹配的文档,而不是单独调用。