Come sincronizzare la query di mongodb async in nodejs
Domanda
Ho una dichiarazione for-loop e un corpo di anello di Async MongoDb.Quello che voglio fare è creare una query find
dal mio database del mio mongolodb e premere il risultato in un array.
Ecco il codice:
function() arrResult() {
var arr = [];
for(...) {
collection.find({ foo: i }, function (err, cursor) {
arr.push(cursor);
}
}
return arr;
}
.
Ma è ovvio che il valore di ritorno della funzione sarebbe un array vuoto.
Voglio affrontare questo problema utilizzando il modulo Q
.C'è qualche soluzione?
Soluzione
.Voglio affrontare questo problema usando il modulo Q.C'è qualche soluzione?
Sì, le promesse sono un'astrazione molto semplice per affrontare questo.È possibile eseguire le domande in parallelo e raccogliere i loro risultati con all
.
In particolare, con Q
sembrerebbe questo:
function arrResult(…) {
var promises = [];
for (…)
promises.push( Q.ninvoke(collection, "find", {foo: i}) );
return Q.all(promises);
}
arrResult(…).then(function(arr) {
…
}, function(err) {
// first error, if any occured
});
. Altri suggerimenti
È necessario un meccanismo di sincronizzazione che agisce come un cancello di processo. Ogni query di ritorno deve arrivare al cancello, ad es.Decrementa qualche contatore e deposita il suo risultato. Quando tutti sono arrivati al cancello, un callback finale restituisce i risultati raccolti.