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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top