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
asynczawsze zwracają promise. Operatorawaitmoże być używany tylko wewnątrz funkcjiasynci 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();