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所有匹配的文档,而不是单独调用。