Обещания в цикле выполнить что-то, когда сделано

StackOverflow https://stackoverflow.com//questions/24029289

Вопрос

в основном я пытаюсь выяснить способ сделать кучу запросов в цикле для цикла, а затем сделать что-то, как только они все завершили.

Я получил это на работу, но только потому, что я использовал эту отличную библиотеку, которая обернут всеми монгодб с обещаниями.

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)
})
.

Мой вопрос в том, что это.Как на земле вы можете сделать что-то вроде без обещаний ??Похоже, это было бы так сложно!

Это было полезно?

Решение

глупо для петлей

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)
});
.


Я получил это на работу, но только потому, что я использовал эту отличную библиотеку, которая обернут всеми монгодб с обещаниями.

в Bluebird Вы могли бы только сделать promisifyAll(require("mongodb")) вместожду кого-то, чтобы сделать модуль.

Другие советы

Вы можете просто использовать простую переменную для подсчета количества ответов, таких как:

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
       }

   }
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top