jquery - pobranie zmiennej z funkcji - zm. globalne?

0

hej, dopiero zaczynam przygode z jquery. Kod odczytuje zawartosc pliku xml i pakuje dane do tablicy. natomiast nie moge użyć tej tablicy poza funkcją. Szukałem po necie ale jakoś nie potrafie znaleźć odpwiedzi. Deklaruje tablice przed funkcją więc powinno działać natomiast zawartość tablicy jest pusta.

var tempDate;
			var tempDateArray = new Array;
 			$.ajax({
            	url: 'rezerwacje.xml',
            	type: 'GET', 
            	dataType: 'xml',
            	success: function(xml){
                	$('rezerwacja', xml).each(function()
					{
                     	tempDate = $('data', this).text();
						tempDateArray.push(tempDate);
						
                	}
					)
            	}
        	}); 
            alert (tempDateArray);

0

Funkcja $.ajax() działa asynchronicznie. Możesz ją odczytać tak: "Przeglądarko, zacznij wysyłać takie i takie żądanie na serwer. Gdy zostanie wysłane, serwer je przetworzy i otrzymasz odpowiedź (może to być za 10 milisekund, albo za 5 sekund), odpal mi funkcję przekazaną w opcji success. Póki co, gdy żądanie sobie idzie, wykonaj dalsze linijki programu.".

Dalszą linijką jest u Ciebie alert().

Czyli tak: deklarujesz zmienne tempDate oraz tempDateArray. Do tej drugiej zmiennej wstawiasz pustą tablicę. Odpalasz funkcję $.ajax() z opcjami. Przeglądarka zaczyna wykonywać żądanie. Zauważ, że kod funkcji success NIE JEST jeszcze wykonywany. Zostanie wykonany dopiero gdy przyjdzie odpowiedź z serwera, czyli np. za parę sekund. Teraz lecimy dalej -- i wykonujemy instrukcję alert(). Wyświetla ona wartość tempDateArray, a tam cały czas jest pusta tablica.

Po tych paru sekundach przychodzi odpowiedź z serwera. Odpalana jest funkcja success. Ustawiane są zmienne tempDate oraz tempDateArray. Ale nic już z nimi nie robisz. To tutaj, wewnątrz funkcji success, mógłbyś wyświetlić wartość tych zmiennych. Albo odpalić funkcję, która je przetworzy. I obyłoby się bez zmiennych globalnych.

Jeśli chciałbyś mieć kod obsługi żądania w innym miejscu, mógłbyś napisać funkcję np. taką funkcję:

function handleResponse(dateArray) {
  alert(dateArray);
}

I wywoływałbyś ją na samym końcu funkcji success, o tak:

handleResponse(tempDateArray);

Obyło się bez zmiennych globalnych. Dane przekazujesz poprzez parametr funkcji.

BTW: zamiast new Array napisz po prostu [] -- zwięźlej i bezpieczniej.

0

oki dzięki, no tak, w success jak dam alert to bez problemu wyświetli zawartość. Dzieki za wytłumaczenie działania funkcji asynchronicznych :) mam tylko pytanie, jesli wrzuce alert(tempdatearray) do success i alert(tempdatearray) po funckji $.ajax (jak w przedstawionym powyżej skrypcie) i odpalę to kolejosc wyswietlania alertów jest taka że wyświetla zawartość tablicy (alert zawarty w success) a nastpenie alert z poza funckji który jest pusty, czyli jak gdyby tablica jest zapełniona i nagle znowu staje się pusta.

Jak już wspomniałem zaczynam przygode z JS a tym bardziej z jquery

pozdro i jeszcze raz dzięki.

0

@zxr9:
To raczej niemożliwe. Nie widzę powodu by tak tu się działo.

Czy nie jest tak, że wyświetla Ci dwa alerty jeden pod drugim? Na wierzchu jest ten... ostatni? I po prostu źle to odczytujesz?

Zamień alerty na console.log(), odpal to np. w Firefoxie z włączoną konsolą. Najpierw będzie log z pustą wartością, potem zapełniony.

Gdybyś przełączył funkcję .ajax() tryb synchroniczny, wtedy alert z success wykonałby się jako pierwszy, ale ten drugi alert też pokazywałby zapełnioną tablicę. Efekt, o którym wspominasz, jest niemożliwy (chyba że coś przeoczyłem) -- tablica NIE będzie nigdy magicznie resetowana.

PS. Trybu synchronicznego, o którym wspomniałem wyżej, nie należy nigdy używać, bo zamraża on całą przeglądarkę (lub przynajmniej kartę, na której jest strona) aż do chwili otrzymania odpowiedzi na żądanie.

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