De algemene sleutel tot asynchrone verwerking is dat u een indicatie wilt hebben van wanneer de huidige iteratie is voltooid voordat u doorgaat naar de volgende iteratie. Aangezien de daadwerkelijke bewerkingen zoals .find()
hier gebruiken ze zelf een "callback" die wordt "geroepen" wanneer de bewerking is voltooid met een antwoord, dan is wat u gewoonlijk wilt doen, iets aanroepen dat uw einde van de iteratie in dezelfde sectie van de code aangeeft.
Op een eenvoudige manier kunt u een vergelijkbaar resultaat krijgen als in traditionele loops met de "async.eachSeries " methode, die slechts "één iteratie tegelijk" laat plaatsvinden:
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");
});
}
Dus elk van de arrayargumenten wordt hier doorgegeven aan de "iterator" -functie als een "item" -parameter, en een tweede argument is een "callback" -functie die later moet worden gebruikt. Elke keer dat de iterator wordt aangeroepen, wordt dat argument doorgegeven aan de .find()
methode die op zijn beurt een eigen "callback" heeft, waarbij het antwoord "error" of "documents" wordt gegeven.
Binnen die callback wordt vervolgens de "callback" die wordt geleverd door de "iterator" -functie aangeroepen om de voltooiing van die huidige iteratie aan te geven. Hierdoor kan de functie "each" hier doorgaan en inderdaad de volgende "iteratie" aanroepen en het volgende array-element verwerken.
Let op uw achtergrond en let op de juiste manier om een "array" in JavaScript te noteren met de []
beugels zoals afgebeeld. Dit is over het algemeen een belangrijk verschil bij het werken met arrays.
Er zijn andere varianten van "async.each" en "async.eachLimit" die beide een zekere mate van parallelle verwerking mogelijk maken, maar de "Series"-methode doet de dingen "in volgorde" op een manier die u gewend bent met traditionele loops.
Dus waar lusbewerkingen "niet-blokkerend" zijn, moet u aangeven wanneer die lus is voltooid voordat u verder wilt gaan.