使用mongodb操作运行for-in循环

时间:2013-12-28 07:14:38

标签: javascript node.js mongodb asynchronous

我有这样的功能......

for(key in object){
    db.collection.findOne(criteria, function(err, doc){
        // ...
        db.collection.update(...);
    })
};

但是,在mongodb调用之前键的值发生变化,即循环进入下一次迭代。有没有办法按顺序进行。或者对于像async.map()这样的对象有什么用于数组吗?

2 个答案:

答案 0 :(得分:2)

所有对回调的调用都将在循环的所有迭代发生之后发生,因此当它们被执行时,key的值将是它的最后一个值。

一个常见的解决方案是将所有调用包装在一个闭包中:

for(key in object){
    (function(key, value) {
        db.collection.findOne(criteria, function(err, doc){
            // ...
            db.collection.insert(...);
        })
    })(key, object[key]);
};

另一种可以实现相同目的的方法是使用Object.keys()方法(从对象中的键创建一个数组)并在数组上调用Array#forEach。这样你就可以跳过额外的闭包,因为forEach已经有一个函数回调:

Object.keys(object).forEach(function(key) {
    db.collection.findOne(criteria, function(err, doc){
        // ...
        db.collection.update(...);
    })
});

哪个可以说更优雅

答案 1 :(得分:1)

你可以建立一个闭包来保存key的值

for(key in object){
  (function(ky) { 
    db.collection.findOne(criteria, function(err, doc){
        // ...
        db.collection.insert(...);
    })
  })(key)
};