Domanda

Fondamentalmente, sto cercando di capire un modo per fare un sacco di query in un ciclo for e poi fare qualcosa una volta che sono state completate.

L'ho fatto funzionare, ma solo perché ho usato questa grande libreria che avvolge tutto mongodb con promesse.

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

La mia domanda è questa.Come diavolo si può fare qualcosa di simile con SENZA promesse??Sembra che sarebbe così difficile!

È stato utile?

Soluzione

Stupido per i loop

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

L'ho fatto funzionare, ma solo perché ho usato questa grande libreria che avvolge tutto mongodb con promesse.

In bluebird avresti potuto farlo promisifyAll(require("mongodb")) invece di aspettare che qualcuno faccia un modulo.

Altri suggerimenti

È possibile utilizzare una semplice variabile per contare il numero di risposte come:

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
       }

   }
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top