Obecným klíčem k asynchronnímu zpracování je, že chcete mít určitou informaci o tom, kdy je aktuální iterace hotová, než přejdete k další iteraci. Od skutečných operací, jako je .find()
zde sami používají "zpětné volání", které je "voláno", když je operace dokončena s odpovědí, pak obvykle chcete zavolat něco, co znamená konec iterace ve stejné sekci kódu.
Základním způsobem můžete získat podobný výsledek jako v tradičních smyčkách s "async.eachSeries " ." metoda, která umožní pouze „jednu iteraci najednou“:
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");
});
}
Takže každý z argumentů pole je zde předán funkci „iterátor“ jako parametr „položka“ a druhý argument je funkce „zpětného volání“, která se použije později. Pokaždé, když je zavolán iterátor, je tento argument předán do .find()
metoda, která má zase vlastní "zpětné volání", kde je uvedena odpověď "chyba" nebo "dokumenty".
Uvnitř tohoto zpětného volání je pak voláno "zpětné volání" poskytované funkcí "iterátor", aby signalizovalo dokončení této aktuální iterace. To umožňuje, aby zde funkce „každý“ pokračovala a skutečně zavolala další „iteraci“ a zpracovala další prvek pole.
Poznamenejte si své pozadí a uvědomte si správný způsob, jak označit „pole“ v JavaScriptu pomocí []
závorky, jak je znázorněno. To je obecně důležitý rozdíl při práci s poli.
Existují další varianty "async.each" a "async.eachLimit" které oba umožňují určitý stupeň paralelního zpracování, ale metoda "Series" dělá věci "po pořádku" způsobem, na který jste zvyklí u tradičních smyček.
Takže tam, kde jsou operace smyčky „neblokující“, musíte před pokračováním uvést, kdy je smyčka dokončena.