Async/await i TypeScript
Den här artikeln förklarar async/await i TypeScript.
YouTube Video
Async/await i TypeScript
I TypeScript är async ett nyckelord för att koncist beskriva asynkrona operationer och fungerar på ett liknande sätt som JavaScript's async/await syntax. Async-funktioner är utformade för att göra hanteringen av funktioner som returnerar Promises mer intuitiv.
Grunderna i async-funktioner
Funktioner som deklareras med nyckelordet async returnerar alltid ett Promise. Här är ett grundläggande exempel:.
1async function fetchData(): Promise<string> {
2 return "Data received";
3}
4
5fetchData().then((data) => console.log(data)); // "Data received"
I detta exempel, eftersom async-funktionen alltid returnerar ett Promise, löses det returnerade värdet automatiskt med Promise.resolve. Med andra ord, "Data received" blir ett Promise<string> och behandlas som en asynkron operation.
Nyckelordet await
Nyckelordet await kan endast användas inom en async-funktion. Detta gör det möjligt att pausa och vänta på resultatet av ett Promise innan funktionens körning fortsätter.
I följande exempel skrivs asynkron bearbetning med fetch med hjälp av 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();I det här exemplet används await för att vänta på att Promise:et som returneras av funktionen fetch ska slutföras, och dess resultat tilldelas variabeln response. Vidare väntas även resultatet av response.json() in.
Felkedja med async/await
Fel som uppstår under asynkron bearbetning kan fångas med hjälp av den vanliga try...catch-syntaxen. Om ett fel uppstår i await-delen, hanteras felet i catch-blocket.
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();I det ovanstående exemplet väntas resultatet av funktionen fetch in med await, och om ett fel uppstår, hanteras det med try...catch.
Fördelar med async/await
-
Intuitiv asynkron bearbetning: Genom att använda
async/awaitblir kodflödet mer intuitivt än när man använderPromise-kedjor (thenellercatch), vilket gör det möjligt att skriva det som synkron bearbetning. -
Enkel felhantering: Användning av
try...catchförenklar felhantering i asynkrona operationer. Du kan skriva mer läsbar kod än genom att användaPromise-kedjor.
async-funktioners returvärden
En async-funktion returnerar alltid ett Promise. Därför är asynkron bearbetning möjlig genom att använda nyckelordet async, även utan att uttryckligen returnera ett Promise.
1async function example() {
2 return 42;
3}
4
5example().then((result) => console.log(result)); // 42
I koden ovan returneras ett synkront värde 42, men eftersom det är inuti en async-funktion konverteras det automatiskt till Promise.resolve(42).
Sekventiell körning av asynkrona funktioner
När du kör flera asynkrona funktioner i följd kan du använda await för att kontrollera deras ordning.
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();I detta exempel körs fetchData2 efter att ha väntat på att fetchData1 ska slutföras. Detta är mer läsbart jämfört med att använda en Promise-kedja.
Parallell körning
Om du vill köra asynkrona operationer parallellt kan du använda Promise.all för att hantera flera Promises samtidigt.
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();I detta fall körs fetchData1 och fetchData2 samtidigt, och processen fortsätter när båda har lösts. Detta möjliggör effektiv hantering av flera asynkrona operationer.
Sammanfattning
- En
async-funktion returnerar ettPromise, och genom att använda nyckelordetawaitkan du vänta på resultatet av en asynkron operation. - Genom att använda
try...catchblir felhanteringen i asynkrona operationer enklare. - Genom att använda
Promise.allär det möjligt att köra flera asynkrona operationer parallellt.
async/await används ofta i TypeScript och JavaScript eftersom det möjliggör en enklare beskrivning av asynkrona operationer.
Du kan följa med i artikeln ovan med hjälp av Visual Studio Code på vår YouTube-kanal. Vänligen kolla även in YouTube-kanalen.