Czyto się da zrobić bez rekurencji

0

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');}
 
}

2

Możesz zamienić rekurencję na pętlę z własnym stosem, coś w tym stylu:

async function explore(path) {
  const paths = [path];

  while (paths.length > 0) {
    const path = paths.pop();
    const response = await (await fetch(path)).json();

    if (response.items) {
      for (const item in response.items) {
        paths.push(item);
      }
    }
  }
}

Przy czym niekoniecznie w jakiś znaczący sposób wpłynie to na ilość wykorzystanej pamięci.

1 użytkowników online, w tym zalogowanych: 0, gości: 1