/ / Jak poprawnie korzystać z JavaScript Async eachLimit - javascript, jquery, async.js

Jak poprawnie korzystać z JavaScript Async eachLimit - javascript, jquery, async.js

Mam problemy z używaniem async.eachLimit. Działa poprawnie dla pierwszych 10 elementów, ale nie przechodzi dalej, po prostu się kończy, więc jeśli jest 100 elementów, to tylko pierwsza 10. Jest to wyraźnie kwestia moich nieporozumień wywołań zwrotnych. Właściwy sposób korzystania z każdej LIMIT z funkcją zewnętrzną, która nie zawiera wywołania zwrotnego? Czy jest to wymagane, aby taka funkcja była dostępna?

async.eachLimit(items, 10, function(item, callback) {
outsideFunction(item.attrOne, item.attrTwo};
//callback();  ---> leads to all running in parallel.
},
function(err) {
console.log(err);
}
);

Odpowiedzi:

0 dla odpowiedzi № 1

Twój problem polega na tym, że używasz biblioteki asynchronicznej dla funkcji, która nie jest asynchroniczna (lub nie działa tak, jakby była asynchroniczna). Co async.eachLimit does to przejrzenie każdego elementu w tablicy, tylko wykonywanie limit kwoty na raz i czeka callback() nazywać się, że aktualna iteracja została zakończona i może dodać kolejną do wykonania.

W przykładzie kodu wywołanie zwrotne (po odkomentowaniu) jest wywoływane natychmiast po próbie wywołania outsideFunction ponieważ wywołanie funkcji nie jest blokujące. Nie czeka, ponieważ async mówi "Powiedziano mi, że to zrobione, przejdę do następnego", więc wszystkie 100 spróbuje i zostanie wykonane w tym samym czasie. Jeśli outsideFunction jest funkcją asynchroniczną wymagania wywołanie zwrotne (lub użycie obietnic), aby powiedzieć, że zakończyło wykonywanie, a wewnątrz tego wywołania zwrotnego wywołasz wywołanie zwrotne async.eachLimit i wtedy będzie to robić tylko 10 naraz w sposób, w jaki chcesz. Oto przykład:

async.eachLimit(items, 10, function(item, callback)
{
outsideFunction(item.attrOne, item.attrTwo, function(someResult)
{
// Your outside function calls back saying it"s finished ...
callback(); // ... so we tell async we"re done
});
},
function(err)
{
console.log(err);
});

Gdyby outsideFunction nie jest twoją funkcją, a funkcja jest rzeczywiścieasynchroniczne, następnie używa obietnic lub musisz znaleźć bibliotekę, która poprawnie zapisuje funkcje asynchroniczne .Jeśli funkcja nie jest asynchroniczna, to async.eachLimit nie działa.

Jeśli jest to twoja funkcja, powinieneś poprosić ją o oddzwonienie, aby się zgodziło (lub skorzystaj z obietnic).