我有这样的功能......
for(key in object){
db.collection.findOne(criteria, function(err, doc){
// ...
db.collection.update(...);
})
};
但是,在mongodb调用之前键的值发生变化,即循环进入下一次迭代。有没有办法按顺序进行。或者对于像async.map()
这样的对象有什么用于数组吗?
答案 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)
};