A chave geral para o processamento assíncrono é que você deseja ter alguma indicação de quando a iteração atual é concluída antes de passar para a próxima iteração. Como as operações reais, como
.find()
aqui eles mesmos empregam um "retorno de chamada" que é "chamado" quando a operação é concluída com uma resposta, então o que você geralmente quer fazer é chamar algo que signifique o fim da iteração na mesma seção de código. De maneira básica, você pode obter um resultado semelhante ao dos loops tradicionais com o "async.eachSeries " método, que permitirá apenas "uma iteração de cada vez" ocorrer:
function check (collection) {
var records = [ { body: "Test 1"}, { body: "Test 2" } ];
async.eachSeries(records,function(item,callback) {
collection.find( item, function (err, rows) {
console.log(rows);
callback(err)
});
},function(err) {
if (err) throw err;
console.log("done");
});
}
Assim, cada um dos argumentos da matriz é passado para a função "iterator" aqui como um parâmetro "item", e um segundo argumento é uma função de "retorno de chamada" a ser usada posteriormente. Toda vez que o iterador é chamado, esse argumento é passado para o
.find()
método que por sua vez tem um "retorno de chamada" próprio, onde a resposta "erro" ou "documentos" é dada. Dentro desse retorno de chamada, o "retorno de chamada" fornecido pela função "iterador" é então chamado para sinalizar a conclusão dessa iteração atual. Isso permite que a função "each" aqui continue e, de fato, chame a próxima "iteração" e processe o próximo elemento da matriz.
Observando seu histórico, esteja ciente da maneira correta de anotar um "array" em JavaScript com o
[]
parênteses como mostrado. Geralmente, essa é uma diferença importante ao trabalhar com matrizes. Existem outras variações de "async.each" e "async.eachLimit" que ambos permitem algum grau de processamento paralelo, mas o método "Series" faz as coisas "em ordem" de uma maneira que você está acostumado com loops tradicionais.
Portanto, onde as operações de loop são "sem bloqueio", você precisa indicar quando esse loop é concluído antes de seguir em frente.