NodeJS V8将附加parameter passing给callback函数

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

一切工作完美,但是,当我有一个循环的抓取logging和做的结果,如下所示:

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

callback函数范围内的variables“i”通过引用传递,结果不是所需的。

当callback被调用时,循环已经运行并且variables已经改变。

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

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

这样,我就失去了“呃,doc”的论点,

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

你可以将它绑定到你的callback函数中,创build一个第一个参数设置为i的部分函数:

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

你在错误的地方应用匿名函数。 它应该在使用i的函数之外应用,而不应用于callback函数。

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

虽然有几个简单的解决scheme来捕获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操作符( 引用 )只需调用一个数据库,并find所有匹配的文档,而不是单独调用。