Javascript中的异步IO和迭代变量

时间:2014-05-01 22:35:52

标签: javascript node.js mongodb

我正在使用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;
            }
        }
    }
});

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

1 个答案:

答案 0 :(得分:1)

当调用传递回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);
}