Sobes.tech
Middle

Opowiedz mi o zasadach asynchroniczności w JavaScript.

sobes.tech AI

Odpowiedź od AI

Zasady asynchroniczności w JavaScript opierają się na modelu jednordzeniowego wykonania, w którym zadania mogące zająć dużo czasu (np. żądania sieciowe, timery) nie blokują głównego wątku, umożliwiając wykonywanie innych działań. Osiąga się to dzięki:

  • Event Loop (Pętla zdarzeń): Mechanizm, który stale sprawdza kolejkę wiadomości i wykonuje zadania z niej. Gdy operacja asynchroniczna się kończy, jej callback jest umieszczany w kolejce zadań.
  • Funkcje callback: Funkcje przekazywane jako argumenty do innych funkcji i wykonywane po zakończeniu operacji asynchronicznej.
  • Promises (Obietnice): Obiekty reprezentujące końcową wartość operacji asynchronicznej, które mogą być rozwiązane (fulfilled) lub odrzucone (rejected). Ułatwiają pracę z kodem asynchronicznym, unikając "callback hell".
  • Async/Await: Słodzik składniowy nad promises, pozwalający pisać kod asynchroniczny w bardziej czytelny, synchroniczny sposób. Funkcje oznaczone async zawsze zwracają promise. Operator await może być używany tylko wewnątrz funkcji async i wstrzymuje wykonanie do czasu rozwiązania promise.

Porównanie podejść:

Podejście Czytelność Obsługa błędów Równoległe wykonanie
Callbacks Niska Trudna Może być nietrivialne
Promises Średnia Wygodna .all(), .race()
Async/Await Wysoka Wygodna (try/catch) Nieco bardziej skomplikowane

Przykład użycia promises:

fetch('/api/data') // Operacja asynchroniczna
  .then(response => response.json()) // Obsługa sukcesu
  .then(data => console.log(data)) // Przetwarzanie danych
  .catch(error => console.error('Błąd:', error)); // Obsługa błędów

Przykład użycia Async/Await:

async function fetchData() {
  try {
    const response = await fetch('/api/data'); // Oczekiwanie na promise
    const data = await response.json(); // Oczekiwanie na promise
    console.log(data);
  } catch (error) {
    console.error('Błąd:', error); // Obsługa błędów
  }
}
fetchData();