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
/await
przepływ kodu jest bardziej intuicyjny niż w przypadku używania łańcuchówPromise
(then
lubcatch
), pozwalając na pisanie w sposób podobny do przetwarzania synchronicznego. -
Prosta obsługa błędów: Użycie
try...catch
upraszcza 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
async
zwracaPromise
, a dzięki użyciu słowa kluczowegoawait
moż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.all
moż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.