Promesses dans A pour boucle, faire quelque chose quand c'est fait
Question
Fondamentalement, j'essaie de trouver un moyen de faire un tas de requêtes dans une boucle pour boucle et de faire quelque chose une fois qu'ils ont tous terminé.
Je l'ai eu pour travailler, mais seulement parce que j'ai utilisé cette grande bibliothèque qui enveloppe toutes les mongodb avec des promesses.
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)
})
Ma question est-ce.Comment sur terre pouvez-vous faire quelque chose comme sans promesses ??Il semble que ce soit si dur!
La solution
stupide pour les boucles
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)
});
Je l'ai eu pour travailler, mais seulement parce que j'ai utilisé cette grande bibliothèque qui enveloppe toutes les mongodb avec des promesses.
dans Bluebird que vous auriez pu venir faire promisifyAll(require("mongodb"))
au lieu deEn attendant que quelqu'un marque un module.
Autres conseils
Vous pouvez simplement utiliser une variable simple pour compter le nombre de réponses comme SO:
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
}
}
}