【问题标题】:Running for-in loop with mongodb operations使用 mongodb 操作运行 for-in 循环
【发布时间】:2014-01-15 17:11:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript node.js mongodb asynchronous


    【解决方案1】:

    所有对回调的调用都将在循环的所有迭代发生后发生,因此当它们被执行时,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(...);
        })
    });
    

    这可以说是更优雅一点

    【讨论】:

    • 谢谢!使用Object.keys() 选项!
    【解决方案2】:

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

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

    【讨论】:

    • 这叫做“闭包”。 Clojure 是一种编程语言 :)
    • 哎呀,最近写的clojure太多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多