Czy to można zrobić prościej, to jest bez rekurencji? Nie, żebym uważała, że tak jest zawile, jest raczej prosto, natomiast rekurencja zdaje się pożera pamięć czy coś w tym rodzaju. W tym kodzie chodzi o pobranie z zewnętrznego źrodła wszystkich rekordów, jednak nie mamy wiedzy ile tych rekordów jest, a admin źródła ograniczył możliwość pobrań do 40 rekordów jednorazowo.
Najprostsza wersja byłaby z do... while. Tyle że nie działa jak powinna, tj. wykonuje tylko jedno pobranie. Biorąc pod uwagę, że w pętli jest funkcja asynchro to juz tak nie dziwi, ale kiedy opatuliłam tą asynchro w IIFE nic to nie zmieniło.
Teoretycznie można by tu może zastosować generator, ale ma być prościej, a nie na odwrót. Stąd prośba - czy to da się załatwić jakąś prostą pętlą?
fetchBooks = (path) =>{
var startIndex = 0; // używane do budowy adresu
var results = []; // w tym kumulują się znalezione rekordy
const that = this; // ta funkcja leży sobie w jednym komponencie i this ma wskazywać na ten zewnętrzny komponent
async function lookFor(){
const fullPath = path + startIndex.toString();// konstruuje właściwy ciąg do przekazania jako adres
try {
const x = await fetch(fullPath);// realizuje pobranie rekordów
const resp = await x.json();
if (resp.items) // jeżeli coś się załadowało to powiększamy licznik i powtarzamy operację
{startIndex = startIndex + 40;
results = results.concat(resp.items);
lookFor();}
else{
const argument = {// dla czytelności wywaliłam zawartość
};
that.startBooks(argument);// wykonuje zadanie na zewnątrz tej funkcji
}
}
catch{ console.log('error');}
}