funkcja pobierająca zawartość JSON

0

Napisałem sobie prostą funkcję, która ma za zadanie:

  • pobrać JSON, który wystawia skrypt PHP
  • przekazać go do innej funkcji
function pobierzDane()
{
    let adres = 'server/plik.php';
    let blad_odczytu = false;
    let tresc_rozmowy = "";

    fetch(adres)
    .then(response => response.json())
    .then(data => 
    { 
        tresc_rozmowy = data;
        innaFunkcja(tresc_rozmowy, blad_odczytu);
    })
    .catch((error) => 
    {
        innaFunkcja(null, !blad_odczytu);
        console.error(error);
    });    
};
0

Ło panie...

Cały kod można by przepisać na async/await dla lepszej czytelności. Zmienna blad_odczytu nie jest nigdzie przestawiana, wygląda jak gloryfikowany false. tresc_wiadomosci zresztą też nie. Przekazywanie wyniku do funkcji to też nie najlepszy pomysł. Generalnie lepiej mieć kod, który to koordynuje, np.

try {
  const data = await pobierzDane();
  innaFunkcja(data);
} catch (e) {
  bylBlad(e);
}

Z mniejszych rzeczy to mógłbyś adres zrobić z const, no i ten snake_case....

0

przepisać na async/await

Mógłbym też użyć XMLHttpRequest ;) W każdym razie poczytam na temat fetch vs async/await

Przekazywanie wyniku do funkcji to też nie najlepszy pomysł.

Chodzi o to, że dane otrzymane w data "biorę w ciemno"?

Z mniejszych rzeczy to mógłbyś adres zrobić z const,

Słuszna uwaga.

no i ten snake_case...

Przyzwyczajenia z innej branży :)

0

Trochę poczytałem. Czyli jest tak:

  • async/await powstało później, niż fetch
  • asyns/awiat umożliwia zrobienie "pauzy" podczas wykonywania kodu
  • async/await uprasza składnie, jeżeli mamy dużo zagnieżdżeń

Czyli w moim przypadku (odczytaj JSON i tyle) fetch teoretycznie wystarczy :)

1
kosmonauta80 napisał(a):

Trochę poczytałem. Czyli jest tak:

  • async/await powstało później, niż fetch
  • asyns/awiat umożliwia zrobienie "pauzy" podczas wykonywania kodu
  • async/await uprasza składnie, jeżeli mamy dużo zagnieżdżeń

Czyli w moim przypadku (odczytaj JSON i tyle) fetch teoretycznie wystarczy :)

Noooo, nie do końca.

async/await, czyli tak zwany konktekst asynchroniczny nie ma nic wspólnego z fetch(), i nie ma znaczenia który był wcześniej. async/await zostały stworzone by uprościć składnie stwarzania Promiseów. Dopisanie keyword'a async zamienia niejawnie funkcję w Promise. Wewnątrz funkcji która jest async, korzystając z faktu że jest "async", możemy użyć innego Promisea, i możemy to znów ukrócić, poprzedzając ją keywordem await.

Innymi słow, zapis async/await, to jest po prostu krótszy zapis tworzenia Promiseów.

Nie ma żadnej "pauzy", nie tak działa JavaScript. await działa tak samo jak każdy inny Promise, czyli po prostu wykonuje jakąś funkcję później, kładąc ją na koniec kontekstu.

Można używać async/await w połączeniu z fetch(), dlatego że fetch() po prostu zwraca Promise, ale zadziała też z innymi funkcjami które go zwracają.

O fetch() możesz przeczytać: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
O async/await możesz przeczytać tu: https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-async-function-definitions

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