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

funkcja javascript

0 głosów
185 wizyt
pytanie zadane 21 listopada 2019 w JavaScript przez karoloo Użytkownik (530 p.)

Witam. Jakiś czas temu zadawałem na forum pewne pytanie, lecz dziś zauważyłem że odpowiedź była błędna, prawdopodobnie przez źle sformułowane przeze mnie pytanie. Tym razem opisze sytuacje poprawnie ;) Tak więc jest sobie kod:

            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open("GET", "game.php?stawka=" + stawka + "&linie=" + linie, true);
            xmlhttp.send();

            xmlhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                    var wynik = this.responseText;
                }
                return wynik;
            };

ma on za zadanie wysłać pewne informacje do php:

            xmlhttp.open("GET", "game.php?stawka=" + stawka + "&linie=" + linie, true);
            xmlhttp.send();

następnie jest pewna funkcja która te dane odbiera i przypisuje do zmiennej wynik. 

            xmlhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                    var wynik = this.responseText;
                }
                return wynik;
            };

Jako że jest to funkcja to tejże zmiennej nie mogę używać poza tą funkcją więc odebrane dane trzeba zwrócić za pomocą return wynik.

I tutaj pojawia się problem. Fragment kodu odpowiadający za odbiór danych zdobyłem z internetu i funkcja jest zadeklarowana nieznanym mi sposobem.

xmlhttp.onreadystatechange = function()

Żeby używać dane poza funkcją próbowałem ją nazwać tak jak się uczyłem, aby później się do niej odwołać:

xmlhttp.onreadystatechange = function testt()

lecz sposób ten nie działa ponieważ zwraca błąd w konsoli

testt is not defined

W jaki sposób mogę nazwać tą funkcje aby móc się odwołać do jej wyniku w dalszej części kodu?

 

1 odpowiedź

+1 głos
odpowiedź 21 listopada 2019 przez ScriptyChris Mędrzec (190,170 p.)
wybrane 21 listopada 2019 przez karoloo
 
Najlepsza

Bezpośrednie zwracanie wartości z kodu asynchronicznego nie zadziała, ponieważ ten kod nie wykonuje się natychmiast (w aktualnym callstacku), ale w następnej iteracji Event Loop. Dlatego zmienną wynik powinieneś obsłużyć (przetworzyć) w ciele funkcji onreadystatechange, albo przekazać ją jako parametr do jakiejś innej funkcji, którą stworzysz poza ciałem funkcji przypisanej do onreadystatechage na zasadzie callbacku. Na przykład:

var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "game.php?stawka=" + stawka + "&linie=" + linie, true);
xmlhttp.send();
 
xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        var wynik = this.responseText;
        processValue(wynik);
    }
};

function processValue(value) {
    // do something with value variable
}

Polecam obejrzeć prezentację na temat asynchroniczności w JavaScript: https://www.youtube.com/watch?v=8aGhZQkoFbQ

xmlhttp.onreadystatechange = function testt()

To jest tzw. named function expresssion. Nazwa testt dostępna jest tylko wewnątrz ciała funkcji, a domyślam się że próbujesz wywołać tą funkcję poza jej ciałem, stąd błąd.

Podobne pytania

0 głosów
1 odpowiedź 363 wizyt
pytanie zadane 18 listopada 2018 w C i C++ przez Ptaszor3 Użytkownik (900 p.)
0 głosów
1 odpowiedź 681 wizyt
pytanie zadane 28 października 2017 w Rozwój zawodowy, nauka, praca przez niezalogowany
0 głosów
1 odpowiedź 547 wizyt

93,772 zapytań

142,730 odpowiedzi

323,382 komentarzy

63,369 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...