Общият ключ към асинхронната обработка е, че искате да имате някаква индикация кога текущата итерация е готова, преди да преминете към следващата итерация. Тъй като действителните операции като .find()
тук самите те използват „обратно извикване“, което се „извиква“, когато операцията е завършена с отговор, тогава това, което обикновено искате да направите, е да извикате нещо, което означава вашия край на итерация в същия раздел на кода.
По основен начин можете да получите подобен резултат, както при традиционните цикли с "async.eachSeries " метод, който ще позволи само „една итерация наведнъж“:
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");
});
}
Така че всеки от аргументите на масива се предава на функцията "iterator" тук като параметър "item", а втори аргумент е функция "callback", която да се използва по-късно. Всеки път, когато се извика итераторът, този аргумент се предава на .find()
метод, който на свой ред има собствено „обратно извикване“, където се дава отговорът „грешка“ или „документи“.
Вътре в това обратно извикване се извиква „обратното извикване“, предоставено от функцията „iterator“, за да сигнализира завършването на тази текуща итерация. Това позволява на функцията "each" тук да продължи и наистина да извика следващата "итерация" и да обработи следващия елемент от масива.
Отбелязвайки своя опит, имайте предвид правилния начин за отбелязване на „масив“ в JavaScript с []
скоби, както е показано. Това обикновено е важна разлика при работа с масиви.
Има и други варианти на "async.each" и "async.eachLimit" които и двете позволяват известна степен на паралелна обработка, но методът "Series" прави нещата "по ред" по начин, който сте свикнали с традиционните цикли.
Така че, когато операциите в цикъла са „неблокиращи“, трябва да укажете кога този цикъл завършва, преди да искате да продължите.