Ogólny klucz do przetwarzania asynchronicznego polega na tym, że przed przejściem do następnej iteracji chcesz mieć pewne wskazanie, kiedy bieżąca iteracja jest wykonywana. Ponieważ rzeczywiste operacje, takie jak .find()
tutaj sami stosują "wywołanie zwrotne", które jest "wywoływane", gdy operacja jest zakończona z odpowiedzią, wtedy to, co zwykle chcesz zrobić, to wywołać coś, co oznacza koniec iteracji w tej samej sekcji kodu.
W prosty sposób możesz uzyskać podobny wynik jak w tradycyjnych pętlach z "async.eachSeries metoda, która pozwoli na wykonanie „jednej iteracji na raz”:
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 więc każdy z argumentów tablicy jest przekazywany do funkcji "iterator" jako parametr "elementu", a drugi argument jest funkcją "wywołania zwrotnego", która ma być używana później. Za każdym razem, gdy wywoływany jest iterator, ten argument jest przekazywany do .find()
metoda, która z kolei ma własne "odwołanie zwrotne", w którym podana jest odpowiedź "błąd" lub "dokumenty".
Wewnątrz tego wywołania zwrotnego wywoływane jest wywołanie zwrotne dostarczone przez funkcję iteratora, aby zasygnalizować zakończenie bieżącej iteracji. Dzięki temu funkcja „każda” może kontynuować i rzeczywiście wywołać następną „iterację” i przetworzyć następny element tablicy.
Zwracając uwagę na swoje tło, pamiętaj o prawidłowym sposobie zapisania „tablicy” w JavaScript za pomocą []
nawiasy, jak pokazano. Jest to generalnie ważna różnica podczas pracy z tablicami.
Istnieją inne odmiany "async.each" i "async.eachLimit" które pozwalają na pewien stopień przetwarzania równoległego, ale metoda "Series" robi rzeczy "w porządku" w sposób, do którego przywykłeś z tradycyjnymi pętlami.
Więc tam, gdzie operacje pętli są „nieblokujące”, musisz zaznaczyć, kiedy ta pętla się zakończy, zanim będziesz chciał przejść dalej.