Den generelle nøgle til asynkron behandling er, at du vil have en indikation af, hvornår den aktuelle iteration er udført, før du går videre til den næste iteration. Siden de faktiske operationer såsom .find()
her selv anvender et "tilbagekald", som "kaldes", når operationen er afsluttet med et svar, så er det, du normalt vil gøre, at kalde noget, der angiver din afslutning på iterationen i den samme kodeafsnit.
På en grundlæggende måde kan du få et lignende resultat, som du kan i traditionelle loops med "async.eachSeries " metode, som kun vil lade "én iteration ad gangen" finde sted:
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");
});
}
Så hvert af array-argumenterne sendes ind til "iterator"-funktionen her som en "item"-parameter, og et andet argument er en "callback"-funktion, der skal bruges senere. Hver gang iteratoren kaldes, sendes argumentet til .find()
metode, som igen har sit eget "tilbagekald", hvor "fejl" eller "dokumenter" svaret er givet.
Inde i det tilbagekald kaldes "tilbagekaldet" tilvejebragt af "iterator"-funktionen derefter for at signalere fuldførelsen af den aktuelle iteration. Dette gør det muligt for "hver"-funktionen her at fortsætte og faktisk kalde den næste "iteration" og behandle det næste array-element.
Bemærk din baggrund, vær opmærksom på den korrekte måde at notere et "array" i JavaScript med []
beslag som vist. Dette er generelt en vigtig forskel, når du arbejder med arrays.
Der er andre varianter af "async.each" og "async.eachLimit" som begge tillader en vis grad af parallel behandling, men "Serie"-metoden gør tingene "i rækkefølge" på en måde, som du er vant til med traditionelle loops.
Så hvor sløjfeoperationer er "ikke-blokerende", skal du angive, hvornår sløjfen er færdig, før du vil gå videre.