XMLHttpRequest problem z pętlą "for"

XMLHttpRequest problem z pętlą "for"
TM
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 3 lata
0
Kopiuj
function loadDoc(x) {	
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {    
      document.getElementById("demo"+x).innerHTML = this.responseText + x + "<br>"; 	   
    }
  };
  xhttp.open("GET", "ajax_info.txt", true);
  xhttp.send();
}

function mojafunkcja() {
	for (i=0; i<256; i++) {		
		loadDoc (i);
	}
	//Dalszy kod przetwarza dane zebrane przez kod
}

Mam taki problem że chcę zrobić zapytanie XMLHttpRequest() i jak pobieram dane z serwera a nie z dysku twardego jak w tym przykładzie to aplikacja zawiesza się.
Myślę że to będzie problem asynchronizacji xhttp.open z wartością TRUE (nie chcę zmieniać synchronizacji gdyż docelowo przeglądarki będą tylko oferować TRUE), jak mam poprawić kod by pętla się wykonywała dane przetwarzały się lecz jak odbierze dane to pętla "leci dalej"
Chyba że się mylę i ktoś może mi pomóc rozwiązać ten problem.

Delor
Nie czekając na odpowiedź odpalasz 256 zapytań do serwera? Trochę dużo jak na jeden raz.
TM
Tak myślałem, lecz czy istnieje jakaś własność XMLHttpRequest co może mi pomóc by kolejne zapytanie odbyło się po odebraniu odpowiedzi z serwera. Albo czy da się to programowo rozwiązać?
LU
  • Rejestracja:ponad 11 lat
  • Ostatnio:9 dni
  • Lokalizacja:Gdańsk
0

Możesz zrobić coś takiego:

Kopiuj
        function loadDoc(x) {
            return new Promise(function (resolve, reject) {
                var xhttp = new XMLHttpRequest();
                xhttp.onreadystatechange = function () {
                    if(this.readyState !== 4) return;

                    if (this.status == 200) {
                        resolve(this.responseText);
                    } else {
                        reject();
                    }
                };
                xhttp.open("GET", "ajax_info.txt", true);
                xhttp.send();
            });
        }

        function loadAllDocs(x) {
            if(x < 256) {
                loadDoc(x).then(function(response) {
                    // do something with response
                    loadAllDocs(++x);
                });
            }
        }

        loadAllDocs(0);

Aczkolwiek trochę słabo, tyle strzałów na raz zamiast załatwić to jednym requestem.


edytowany 2x, ostatnio: lukascode
TM
OK, dziękuję za podpowiedź. Przetestuje. Dam znać co wyszło. Też wolę jedno zapytanie lecz serwer ma 256 węzłów i muszę każdy z osobna odpytać w pętli niestety nie da się to w jednym zapytaniu serwer nie odpowiada jako cały ciąg.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.