Zwracanie danych przez XMLHttpRequest i ich zasięg (a może opóźnienie)

0

Mam taką funkcje pobierającą dane z serwera :

function ktory_poz_kat(a){
	
if (typeof XMLHttpRequest == "undefined") {XMLHttpRequest = function() {  return new ActiveXObject(navigator.userAgent.indexOf("MSIE 5") >=0 ? "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP");}}	
    var zap_php = new XMLHttpRequest();
	zap_php.onreadystatechange = function(){
		if (zap_php.readyState == 4 ){
			
			console.log("odp_ws:"+zap_php.responseText);
	
		}

	};	
	zap_php.open("GET","./front/wstecz_kat.php?liczod="+a+"&f=1", true);
	zap_php.setRequestHeader("Content-Type", "text/xml");
	zap_php.send();

	return zap_php.responseText;

}

//wywołanie np:
console.log(ktory_poz_kat(43));

Problem w tym iż nie wiem jak uzyskać dostęp do wyniku - return oddaje mi nic (undefined) - a console.log oddaje wynik - ale już po fakcie :/
Jak to zrealizować tak by działało - czyli by wynik był oddane przez funkcję?

0

Wiesz jak działa asynchroniczność? Pierw jest wykonywany cały kod, a dopiero później kod asynchroniczny, dlatego return nic nie zwraca, a console.log wpisywany jest 'po fakcie'.
@Edit: najprościej będzie za pomocą funkcji zwrotnych:

function ktory_poz_kat(a, cb) {
    if (typeof XMLHttpRequest == "undefined") {
        XMLHttpRequest = function () {
            return new ActiveXObject(navigator.userAgent.indexOf("MSIE 5") >= 0 ? "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP");
        };
    }
    var zap_php = new XMLHttpRequest();
    zap_php.onreadystatechange = function () {
        if (zap_php.readyState == 4) {
            if (typeof cb == 'function') cb(zap_php.responseText);
        }
    };
    zap_php.open("GET", "./front/wstecz_kat.php?liczod=" + a + "&f=1", true);
    zap_php.setRequestHeader("Content-Type", "text/xml");
    zap_php.send();
}

//wywołanie
ktory_poz_kat(43, function(response) {
    console.log(response);
});
0

Witam
Dzięki za odpowiedz - i mimo że się nie przydała (przekonstruowałem całość i teraz śmiga :) ) - to zapytuje jak działa to co napisałeś - ta funkcja zwrotna ?

0

Funkcja zwrotna, jest to funkcja anonimowa, która przekazuje się jako argument do funkcji. Dzięki temu, możesz ją wywołać w dowolnym momencie działania funkcji docelowej. Tutaj przy asynchroniczności, wywołujemy ją, gdy otrzymaliśmy już odpowiedz od serwera. Nie jest to jednak najlepsze praktyka. Obecnie, gdy mamy ES6, najlepiej jest stosować generatory + obietnice, czyli new Promise, *function oraz metoda .then() dla obietnic.

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