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 № 1Twó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).