【问题标题】:Promises in a for loop, do something when donefor 循环中的 Promise,完成后做某事
【发布时间】:2014-07-24 14:56:22
【问题描述】:

基本上,我正在尝试找出一种方法来在 for 循环中执行一堆查询,然后在它们全部完成后执行一些操作。

我让它工作了,但这只是因为我使用了这个很棒的库,它用 Promise 包装了所有 mongodb。

var mongo = require('mongod') 
var db = mongo('mongodb://localhost/builder', ['block''])
var block_ids = ['538d097bbb12479d0e9f70ab', '538ddc7d06c1f0fe296178b1'];

var prom = null;
var blocks = [];
for (i in block_ids) {
    var block_id = block_ids[i];
    prom = db.block.findOne({_id:db.ObjectId(block_id)})
    .then(function(results) {
        blocks.push(results);
    })
}
prom.done(function() {
    console.dir(blocks)
    console.log("DONE! " + blocks.length)
})

我的问题是这样的。在没有承诺的情况下,你到底怎么能做类似的事情?好像很难啊!

【问题讨论】:

  • 你不应该回避承诺。它们已经在 ES6 中标准化,现在甚至在浏览器中。方法是使用它们。

标签: node.js mongodb promise q monk


【解决方案1】:

您可以使用一个简单的变量来计算响应的数量,如下所示:

var responses = 0;
var blocks = [];

for(var i=0; i<block_ids.length; i++) {
   var block_id = block_ids[i];
   db.block.findOne({_id:db.ObjectId(block_id)}, function (err, result) {
       if(err) {
         console.log(err);
       }
       responses++;
       blocks.push[result];

       if (responses === block_ids.length-1) {
           console.log('all find queries have responded');
           // do whatever
       }

   }
}

【讨论】:

    【解决方案2】:

    愚蠢的for循环

    var mongo = require('mongod') 
    var db = mongo('mongodb://localhost/builder', ['block''])
    var block_ids = ['538d097bbb12479d0e9f70ab', '538ddc7d06c1f0fe296178b1'];
    
    
    Q(block_ids.map(function(block_id) {
        return db.block.findOne({_id:db.ObjectId(block_id)});
    })).all().done(function(blocks) {
        console.dir(blocks)
        console.log("DONE! " + blocks.length)
    });
    

    我让它工作了,但这只是因为我使用了这个很棒的库,它用 Promise 包装了所有 mongodb。

    bluebird you could have just done promisifyAll(require("mongodb")),而不是等待别人制作模块。

    【讨论】:

      猜你喜欢
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多