Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js/jquery] zwracanie wartości przez funkcje, zmienne globalne i zasięg zmiennych
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
wujek_bogdan
Nie do końca jest dla mnie jasna sprawa z zasięgiem zmiennych. Wiem jak sprawa wygląda w teorii, jednak w praktyce sobie z tym nie radzę. Chcę uniknąć tworzenia zmiennych globalnych jako pole obiektu window i rozwiązać sprawę bardziej elegancko.

Na początku przedstawię problem. Skrypt w PHP "search_dir.php" zwraca mi jakąś wartość np.: ilość plików danego typu w katalogu, ilość katalogów, listę plików w tablicy w zależności od podanych parametrów i robi to dobrze. Problem jest z przetworzeniem tych danych pobieranych ajaxem. Funkcja getDir() pobiera dane, a następnie przekazuje w callback zmienną 'data' do funkcji 'galleries(). Tutaj pojawia się problem. Chcę dalej operować na zmiennej data, ale nie chcę tworzyć nowego pola obiektu window.

Tworzę nowy obiekt 'gal' klasy Gallery() i w pole gal.count chcę wstawić, to co zwrócił mi skrypt w PHP (np. w tym wypadku ilość katalogów). W tym momencie mam sprzeczne informacje co do tego, co zwraca mi funkcja galleries().
Kod
        getDir('galeria');
        alert(data);
        alert(gal.count);

w takiej postaci otrzymuję 2 alerty: [Object] i 4 ((4 to ilość katalogów w podanym katalogu)
w tej postaci
Kod
        getDir('galeria');
        //alert(data);
        alert(gal.count);

otrzymuję jeden alert o pustej treści

w tej postaci
Kod
        getDir('galeria');
        alert(data);
        //alert(gal.count);

otrzymuję alert o treści [object]

Tutaj mam pytanie. Czemu w drugim przypadku otrzymuję pusty alert, zamiast alert o treści 4. W jaki sposób zwrócić wartość funkcji galleries(), tak żebym mógł z tej wartości dalej korzystać. Dane zwracane przez skrypt PHP będą służyły do dynamicznego generowania galerii zdjęć na podstawie zawartości podanego katalogu.

Kompletny kod skryptu:
CODE
<script type="text/javascript">

//var data;
Gallery = function() {}
Gallery.prototype.name = ''
gal = new Gallery();

$(document).ready(function() {

function getDir(dir){

$.post('search_dir.php', {
'directory': dir,
'type': 'directory'
}, function(data){
galleries(data);
});

}

function getDirContent(dir){

$.post('search_dir.php', {
'directory': dir,
'type': 'directory',
'extension': 'jpg',
'list': 'true'
}, function(data){
//alert(data);
});

}

function galleries(data) {
gal.count = data;
};

getDir('galeria');
alert(data);
alert(gal.name);

});
#luq
Tu chodzi o asynchroniczność. Dla przykładu:

Kod
function getDir(dir){

$.post('search_dir.php', {
'directory': dir,
'type': 'directory'
}, function(data){
galleries(data);
});


Funkcja:

Kod
function(data){
galleries(data);
}


Wywoła się dopiero po odebraniu od serwera odpowiedzi (readyState == 4) wiec jeśli napiszesz:

Kod
getDir('foo/');
alert(123); // w tym miejscu nie ma pewnosci (tak samo jak wszedzie ponizej) czy juz zostala wywolana funkcka galleries()

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.