Autor Wątek: [JS] .post użycie zmiennych w funkcji innilne  (Przeczytany 815 razy)

Offline LizarD

  • Użytkownik

# Styczeń 04, 2017, 13:17:47
Witam!

Mam sobie funkcja costam() w tej funkcji tworzę zmienne i wywołuje funkcję $.post w której jest funkcja inline reagująca na odczyt z serwera i teraz pytanie czy dobrą praktyką jest odczyt tych zmiennych ( w funkcji costam )w tej funkcji inline ?
 Ciekawostką jest iż funkcja costam też jest wywołana w innej funkcji.

function costam () {

    var jakas_zmienna = ...;
    var druga_zmienna = ....;

   var postData = {
        'a'      : jakas_zmienna,
        'b'   : druga_zmienna
    };

$.post( "....php", postData , function( data ) {

      // I tutaj potrzebuje tych zmiennych jakas_zmienna i druga_zmienna
     // Więc najlepiej może jest mi przesłać je do serwera i odebrać żeby tutaj użyć
     // Zapisać je globalnie ?
     // Czy tak jak jest teraz to nie ma problemu ? Nie wiem czy funkcja .post zatrzymuje działanie kodu aż do momentu odebrania danych od serwera

});

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Liosan

  • Redaktor

# Styczeń 04, 2017, 13:29:15
Możesz przechować odwołanie do jakas_zmienna / druga_zmienna wewnątrz domknięcia (closure) które podałeś jako callback. W zasadzie - Twój kod jużto robi :) Ale przeczytaj dokładnie jak zachowuje się scope zmiennych, zwłaszcza "closures in loops - a common mistake" sporo wyjaśnia:
https://developer.mozilla.org/en/docs/Web/JavaScript/Closures

Liosan

Offline lethern

  • Użytkownik

# Styczeń 04, 2017, 17:34:05
problem o którym Liosan wspomniał:

function costam () {
    var jakas_zmienna = 1;

    (...)

    $.post( "....", postData ,
        function() {
            alert( jakas_zmienna );
        });

    jakas_zmienna= 2;
}
alert wyświetli 2
..Z tym że ten problem u Ciebie raczej nie występuje
raczej chodzi o to żebyś był tego świadomy; np. gdybyś napisał coś takiego:
(poniżej zamiast post+callback dałem zwykły timer)
for(var i=0; i<3; ++i){
    setTimeout( function(){ alert(i); }, 0);
}
to można sprawdzić w konsoli przeglądarki, wszystkie alerty wyświetlą 3 (można to odczytać jako wyświetlą aktualną wartość pod "wskaźnikiem" i)

możliwym rozwiązaniem jest (analogicznie jak opisali pod podanym wcześniej linkiem)
for(var i=0; i<3; ++i){
    (function(){
        var captured_i= i;
        setTimeout( function(){ alert(captured_i); }, 0);
    })();
}
działa to z tego powodu, że zamiast korzystać z jednej zmiennej i, teraz mamy na każdym kroku pętli tworzoną "closure" ze swoją osobną zmienną
« Ostatnia zmiana: Styczeń 04, 2017, 17:47:02 wysłana przez lethern »