XMLHttpRequest Schleife - selbst aufrufende Funktion


strukturart

Erfahrenes Mitglied
#1
Hallo,

ich möchte bei einer xmlhttpRequest Abfrage die Url "dynamisch" anpassen.
Anstatt einer for-loop rufe ich nach

xhttp.readyState === xhttp.DONE && xhttp.status === 200

die Anfrage die sich in einer Funktion befindet nochmal selbst auf. Die Url gebe ich als Parameter der Funktion mit, diese kommen von einem Array ist das Array "abgearbeitet" stoppt der Loop.

Aber die Url wird leider nie überschrieben es wird immer die bei der ersten Abfrage gesetzten verwendet.

Was mache ich denn falsch ?



Javascript:
var episode_limit = 0;
var url_counter = -1;





function podcast_downloader(param_value)
{

    episode_limit = 0;
    alert(param_value)

    var xhttp = new XMLHttpRequest({ mozSystem: true });

    xhttp.open('GET',param_value,true)
    xhttp.withCredentials = true;
    xhttp.responseType = 'document';
    xhttp.overrideMimeType('text/xml');


    


    xhttp.onload = function () {
        if (xhttp.readyState === xhttp.DONE && xhttp.status === 200) {

    
        var data = xhttp.response;


        $(data).find('item').each(function(){


            var file_name = ($(this).find('title').text());
            var podcast_url =  $(this).find('enclosure').attr('url')


            
        
                episode_limit++;
                    if(episode_limit==1)
                    {

                        //push file url in array to download later
                        podcast_file_list.push(podcast_url)
                        url_counter++;

                        if (url_counter < podcast_url_list.length)
                        
                        {


                            alert(podcast_url)
                            param_value = "";
                            podcast_downloader(podcast_url_list[url_counter])

                            
                        }
                    }

                    else
                    {
                        return false;
                    }

                })



        }
    };



    xhttp.onerror = function () {
    alert("error");
    };

    xhttp.send(null)

}
 

Sempervivum

Erfahrenes Mitglied
#2
Leider kann man aus dem Code nicht ersehen, was da in der Antwort vom Server drin steht, aber eines fällt mir auf:
In deiner Funktion setzt Du episode_limit auf 0 und inkrementierst es in der each-Schleife. Hat es 1, hängst Du die URL aus der Antwort an die Liste an. Im nächsten Schleifendurchlauf ist episode_limit dann ungleich 1, Du gelangst in den else-Zweig und verlässt die Funktion. D. h. im Endeffekt wertest Du bei jeder Antwort immer nur das erste Element der Items aus. Ist das so gewollt?
 

strukturart

Erfahrenes Mitglied
#3
Ja das ist so gewollt damit nur die neuste Episoden heruntergeladen wird. Nun funktioniert es aber nicht sehr "sauber":

Javascript:
    if (url_counter < podcast_url_list.length)
                        
                        {


                             setTimeout(function () {
        podcast_downloader(podcast_url_list[url_counter])
    }, 5000);



                            
                        }
Dachte das DONE sagt aus das die angeforderten Daten da sind und man neue anfordern kann, ist das nicht so ?