• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja nie przekazuje wartości w return.

Object Storage Arubacloud
0 głosów
184 wizyt
pytanie zadane 12 maja 2016 w JavaScript przez ShiroUmizake Nałogowiec (46,300 p.)

Obiekt XML istnieje w uruchomionej metodzie, jednakże poza nią już nieistnieje. Czy nie można w ten sposób przepisywać wartości do zmiennych?

Contract.prototype.validateForm = function ()
{
var Connect = new AJAX("GET" , "JS/class/XML/ValidateParam.xml" );
var XML = Connect.getXML();
alert (XML); // zwraca null
var optionArr = Connect.readXML(XML); // przez co tutaj również pojawia się błąd.
alert (optionArr[0]);
}

Metoda:


AJAX.prototype.getXML = function ()
{
var request = null;
var xmlResponse = null;
var XMLArr = new Array ();
	if (window.XMLHttpRequest){
	request = new XMLHttpRequest ();
	} else if (window.ActiveXObject){
	request = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (request)
	{
	request.open(this.method , this.file);
		request.onreadystatechange = function () {
			if (request.readyState == 4){
			alert ("OK");
			xmlResponse = request.responseXML;
			}
		}	 
	request.send(null);
	} else {
	alert ("Nie działczy");
	// var error = new Error ();
		// error.CriticError();
		return;
	}
	alert (xmlResponse); // Tutaj istnieje dokument XML.
return xmlResponse;
}

Chyba wiem, w czym problem. validateForm wykonuje się szybciej niż AJAX. Przez co przekazuje NULL tak mi się przynajniej wydaje.

2 odpowiedzi

+2 głosów
odpowiedź 12 maja 2016 przez Comandeer Guru (602,330 p.)
0 głosów
odpowiedź 12 maja 2016 przez rafal.budzis Szeryf (85,260 p.)

Polecam Promise do takich rzeczy bardzo przyjemnie obsługuje się dzieki temu jakąkolwiek asynchroniczną działalność programu. 

AJAX.prototype.createRequest = function ()
{
    if (window.XMLHttpRequest){
        return new XMLHttpRequest ();
    }
    if (window.ActiveXObject){
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
    return null;
}

AJAX.prototype.getXML = function ()
{
    var request = this.createRequest();;
    var xmlResponse = null;
    var XMLArr = new Array ();

    return new Promise((resolve, reject) => {
        if(request === null){
            reject("Nie działczy");
            return;
        }
        
        request.open(this.method , this.file);
        request.onreadystatechange = () => {
            if (request.readyState == 4){
                resolve(request.responseXML);
            }
        }    
        request.send(null);
    
    });

}

Wywołanie się troche zmieni.

Contract.prototype.validateForm = function ()
{
    var Connect = new AJAX("GET" , "JS/class/XML/ValidateParam.xml" );
    var optionArr = {};
    Connect.getXML().then((XML) => {
        optionArr = Connect.readXML(XML);
        alert (XML);
    });

}

Z góry sorry jeśli nie będzie działać i uprzedzam ze kompatybilnosć wstecz jest słaba. Niekoniecznie z wzgledu na Promise a arrow function popatrzysz na przykłady Promise w necie i myśle ze zrozumeisz :)

1
komentarz 12 maja 2016 przez Comandeer Guru (602,330 p.)
Jak już idziemy w obiecanki, to lepiej po prostu polecić Fetch API, które obiecanki ma wbudowane ;) https://developer.mozilla.org/en/docs/Web/API/Fetch_API
komentarz 12 maja 2016 przez rafal.budzis Szeryf (85,260 p.)

@Comandeer dzięki :)

komentarz 14 maja 2016 przez ShiroUmizake Nałogowiec (46,300 p.)
Jak dobrze zrozumiałem to wywołuje w klasie Contract obiekt Connect o klasie AJAX, następnie wywołuje funkcję, której zwrot przekazuje do pozostałych metod. Coś jak callback, tylko że nie czeka?

Ciekawy ten fetch. A jak wygląda obecnie wsparcie dla API (oprócz, IE ale mnie to nie dziwi)?
komentarz 14 maja 2016 przez Comandeer Guru (602,330 p.)

Coś jak callback, tylko że nie czeka?

Czy ja wiem, czy można to tak określić? Obiecanki też czekają (zresztą tłumaczyłem to w swoim artykule). 

 A jak wygląda obecnie wsparcie dla API (oprócz, IE ale mnie to nie dziwi)?

No przecież jest tam tabelka na MDN... Zawsze też można się posiłkować Can I Use: http://caniuse.com/#feat=fetch 

Podobne pytania

0 głosów
1 odpowiedź 204 wizyt
pytanie zadane 24 kwietnia 2020 w Java przez danielo665 Obywatel (1,040 p.)
0 głosów
3 odpowiedzi 1,954 wizyt
pytanie zadane 12 sierpnia 2015 w C i C++ przez Koder Nowicjusz (200 p.)
0 głosów
1 odpowiedź 122 wizyt
pytanie zadane 23 lipca 2019 w C i C++ przez zuajestem Początkujący (410 p.)

92,623 zapytań

141,478 odpowiedzi

319,821 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...