Async/await w TypeScript
Ten artykuł wyjaśnia async/await w TypeScript.
YouTube Video
Async/await w TypeScript
W TypeScript async jest słowem kluczowym służącym do zwięzłego opisywania operacji asynchronicznych i działa podobnie do składni async/await w JavaScript. Funkcje oznaczone jako async są stworzone, aby ułatwić obsługę funkcji zwracających Promisy.
Podstawy funkcji async
Funkcje zadeklarowane ze słowem kluczowym async zawsze zwracają Promise. Oto podstawowy przykład:.
1async function fetchData(): Promise<string> {
2 return "Data received";
3}
4
5fetchData().then((data) => console.log(data)); // "Data received"
W tym przykładzie, ponieważ funkcja async zawsze zwraca Promise, zwracana wartość jest automatycznie rozwiązywana za pomocą Promise.resolve. Innymi słowy, "Data received" staje się Promise<string> i jest traktowane jako operacja asynchroniczna.
Słowo kluczowe await
Słowo kluczowe await może być używane tylko wewnątrz funkcji async. Pozwala to na wstrzymanie i oczekiwanie na wynik Promise przed kontynuowaniem wykonywania funkcji.
W poniższym przykładzie przetwarzanie asynchroniczne za pomocą fetch zostało napisane z użyciem async/await.
1async function getUserData() {
2 try {
3 const response = await fetch("https://codesparklab.com/json/example.json");
4 const data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error("Error fetching user data:", error);
8 }
9}
10
11getUserData();W tym przykładzie await jest używane do oczekiwania na zakończenie Promise zwróconego przez funkcję fetch, a wynik jest przypisany do zmiennej response. Dodatkowo, wynik response.json() również jest oczekiwany.
Obsługa błędów z async/await
Błędy występujące podczas przetwarzania asynchronicznego mogą być przechwytywane za pomocą standardowej składni try...catch. Jeśli błąd wystąpi w części await, jest obsługiwany w bloku catch.
1async function fetchDataWithErrorHandling() {
2 try {
3 const response = await fetch('https://invalid.codesparklab.com/');
4 if (!response.ok) {
5 throw new Error(`HTTP error! status: ${response.status}`);
6 }
7 const data = await response.json();
8 console.log(data);
9 } catch (error) {
10 console.error("Fetch error:", error);
11 }
12}
13
14fetchDataWithErrorHandling();W powyższym przykładzie wynik funkcji fetch jest oczekiwany za pomocą await, a ewentualne błędy są obsługiwane za pomocą try...catch.
Zalety async/await
-
Intuicyjne przetwarzanie asynchroniczne: Dzięki użyciu
async/awaitprzepływ kodu jest bardziej intuicyjny niż w przypadku używania łańcuchówPromise(thenlubcatch), pozwalając na pisanie w sposób podobny do przetwarzania synchronicznego. -
Prosta obsługa błędów: Użycie
try...catchupraszcza obsługę błędów w operacjach asynchronicznych. Możesz pisać bardziej czytelny kod niż przy użyciu łańcuchówPromise.
Wartości zwracane przez funkcje async
Funkcja async zawsze zwraca Promise. Dlatego, nawet bez jawnego zwracania Promise, przetwarzanie asynchroniczne jest możliwe dzięki użyciu słowa kluczowego async.
1async function example() {
2 return 42;
3}
4
5example().then((result) => console.log(result)); // 42
W powyższym kodzie zwracana jest synchroniczna wartość 42, ale ponieważ znajduje się w funkcji async, jest automatycznie konwertowana na Promise.resolve(42).
Sekwencyjne wykonywanie funkcji asynchronicznych
Podczas wykonywania wielu funkcji asynchronicznych po kolei, można użyć await, aby kontrolować ich kolejność.
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function processData() {
19 const data1 = await fetchData1();
20 console.log(data1);
21
22 const data2 = await fetchData2();
23 console.log(data2);
24}
25
26processData();W tym przykładzie fetchData2 jest wykonywane po zakończeniu fetchData1. Jest to bardziej czytelne w porównaniu do użycia łańcucha Promise.
Wykonywanie równoległe
Jeśli chcesz wykonywać operacje asynchroniczne równolegle, możesz użyć Promise.all, aby obsłużyć wiele Promise jednocześnie.
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function fetchMultipleData() {
19 const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
20 console.log(data1);
21 console.log(data2);
22}
23
24fetchMultipleData();W tym przypadku fetchData1 i fetchData2 są wykonywane jednocześnie, a proces przechodzi dalej po ich zakończeniu. To umożliwia efektywne zarządzanie wieloma operacjami asynchronicznymi.
Podsumowanie
- Funkcja
asynczwracaPromise, a dzięki użyciu słowa kluczowegoawaitmożna zaczekać na wynik operacji asynchronicznej. - Dzięki zastosowaniu konstrukcji
try...catch, obsługa błędów w operacjach asynchronicznych staje się prostsza. - Dzięki użyciu
Promise.allmożliwe jest wykonywanie wielu operacji asynchronicznych równolegle.
async/await jest szeroko stosowany w TypeScript i JavaScript, ponieważ pozwala na prostsze opisywanie operacji asynchronicznych.
Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.