Javascript中的异步IO和迭代变量

Javascript中的异步IO和迭代变量,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在与NodeJS和MongoDB合作,一开始我会创建集合,如果它们还不存在,我会填充它们。现在,这只是开发,但有了备份和其他东西,我最终可能会在生产中做同样的事情或类似的事情 我的问题是迭代变量(i)将发生什么变化?回调会为该迭代使用正确的值吗?或者它会在列表的后面得到一些其他的值,或者根本没有 ldb.createCollection('people', { strict: true }, function(err, col){ if(err) { console.log('cre

我正在与NodeJS和MongoDB合作,一开始我会创建集合,如果它们还不存在,我会填充它们。现在,这只是开发,但有了备份和其他东西,我最终可能会在生产中做同样的事情或类似的事情

我的问题是迭代变量(
i
)将发生什么变化?回调会为该迭代使用正确的值吗?或者它会在列表的后面得到一些其他的值,或者根本没有

ldb.createCollection('people', { strict: true }, function(err, col){
    if(err) { console.log('createCollection( people ) ', err); } 
    else { 
        for(var i in people){
            col.insert(people[i], { w: 1 }, function(err, doc){
                people[i]._id = doc._id;
            }
        }
    }
});

编辑:这是一个对象,而不是数组。

调用传递到
insert
的回调时,
i
的值将不会被保留(它很可能是
people
中的最后一个键)。如果您想保留
i
,您可以给它自己的功能范围,如下所示:

people.forEach(function(person, i) {
    col.insert(person, { w: 1 }, function(err, doc) {
        person._id = doc._id;
    });
});
编辑: 使用匿名函数而不是forEach方法:

for(var i in people) {
    function(i) {
        col.insert(people[i], { w: 1 }, function(err, doc){
            people[i]._id = doc._id;
        });
    }(i);
}

那么
(函数(var1,var2){/*做点什么*/}(this.var1,this.var2)呢
?似乎我见过在案例中使用它?如何实现?它会工作吗?这是一个对象,而不是数组,因此它没有foreach函数。是的。这可能是解决您问题的更精确的方法。我将在我的答案中添加一个例子。我建议使用
foreach
调用的唯一原因是它是cleaner并避免与循环中的..相关的
常见问题(例如要求使用
hasOwnProperty
方法)。my$0.02:我发现在包装器内部使用不同的变量名比在包装器外部使用不同的变量名时,扫描更容易。重复“i”可以工作并保留源代码,但可能会混淆…因为
insert
似乎是异步的,那么在执行回调之前,yes
i
将更改。请参阅