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

[AJAX] object not defined

Cloud VPS
0 głosów
210 wizyt
pytanie zadane 27 marca 2019 w JavaScript przez niezalogowany
function a() {
  przedmiot = pobierz_lista_function()
}
function pobierz_przedmioty_lista_function() {
  console.log("pobierz_przedmioty_lista_function");
  $.ajax({
    async: "false",
    url: "Odczytaj/przedmioty.php",
    method: "post"
  })
  .done(res => {
    przedmioty = JSON.parse(res);
  })
  .fail(error => {
    console.error(error);
  });
  return przedmioty;
}

Funkcja a wywoływana jest przy naciśnięciu przycisku. Przy pierwszym wywołaniu dostaje komunikat:

pobierz_dane.js:62 Uncaught ReferenceError: przedmioty is not defined
    at pobierz_przedmioty_lista_function (pobierz_dane.js:62)
    at HTMLDivElement.Przedmioty_function (main.js:176)
    at HTMLDivElement.dispatch (jquery-3.3.js:2)
    at HTMLDivElement.y.handle (jquery-3.3.js:2)

Przy drugim wywołaniu wszystko działa. async: false nie powinno temu zapobiegać? Jak to poprawić?

1 odpowiedź

0 głosów
odpowiedź 27 marca 2019 przez adrian17 Mentor (354,120 p.)

Źle do tego podchodzisz.

Zacznijmy od tego, że Twoje użycie async: false w ten sposób jest oficjalnie w jQuery zdeprecjonowane. W ogólności wykonywanie synchronicznych zapytań jest unikane.

Twoje `pobierz_przedmioty_lista_function` powinno zwrócić sam promise, a w kolejnej funkcji dać

function a() {
  pobierz_lista_function().then(przedmiot => {
    // cokolwiek chcesz zrobić z przedmiotem
  });
}

Albo użyć async/await:

async function a() {
  let przedmiot = await pobierz_lista_function();
}

 

komentarz 27 marca 2019 przez niezalogowany
Z await efekt jest taki sam. Sprawdzę jeszcze z promise. Inne funkcje pobierające dane działają poprawnie za pierwszym razem.
komentarz 27 marca 2019 przez adrian17 Mentor (354,120 p.)

Z await efekt jest taki sam. Sprawdzę jeszcze z promise

(Pokaż co robisz.)

komentarz 27 marca 2019 przez niezalogowany
async function a() {
  przedmioty = await pobierz_przedmioty_lista_function();
  console.log(przedmioty);
 
}

pobierz_przedmioty_lista_function bez zmian.

komentarz 27 marca 2019 przez adrian17 Mentor (354,120 p.)

pobierz_przedmioty_lista_function bez zmian.

To nie zrozumiałeś.

Twoje `pobierz_przedmioty_lista_function` powinno zwrócić sam promise

Czyli

function pobierz_przedmioty_lista_function() {
  return $.ajax({
    url: "Odczytaj/przedmioty.php",
    method: "post",
    dataType: "json",
  });
}

 

Podobne pytania

0 głosów
0 odpowiedzi 329 wizyt
0 głosów
0 odpowiedzi 694 wizyt
0 głosów
1 odpowiedź 1,738 wizyt
pytanie zadane 9 maja 2018 w JavaScript przez Regmar Nowicjusz (120 p.)

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,838 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

Kursy INF.02 i INF.03
...