Como sincronizar o MongoDB assíncrono consulta no NodeJS
Pergunta
Eu tenho um ciclo de instrução e um assíncrono MongoDB dentro do corpo do loop.O que eu quero fazer é fazer uma find
consulta a partir do meu banco de dados MongoDB, e empurre o resultado em uma Matriz.
Aqui está o código:
function() arrResult() {
var arr = [];
for(...) {
collection.find({ foo: i }, function (err, cursor) {
arr.push(cursor);
}
}
return arr;
}
Mas é óbvio que o valor de retorno da função deve ser uma Matriz vazia.
Eu quero resolver este problema usando Q
módulo.Existe alguma solução?
Solução
Eu quero resolver este problema usando o Q módulo.Existe alguma solução?
Sim, promessas são muito fáceis de abstração para lidar com isso.Você pode executar consultas em paralelo, e recolher os seus resultados com all
.
Em particular, com Q
ele teria esta aparência:
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
});
Outras dicas
Você precisa de um mecanismo de sincronização que funciona como um processo de portão.Cada consulta retornando tem para chegar ao portão, e.g.diminui alguns contador de depósitos e de seu resultado.Quando todos chegaram no portão, um final de chamada de retorno não devolver os resultados coletados.