我使用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));
}
通过这种方式,我失去了“错误,文档”的论点,
我可以做些什么来解决这个大问题?
答案 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)只需调用一次数据库,找到所有匹配的文档,而不是单独调用。