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
/await
blir kodflödet mer intuitivt än när man använderPromise
-kedjor (then
ellercatch
), vilket gör det möjligt att skriva det som synkron bearbetning. -
Enkel felhantering: Användning av
try...catch
fö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 nyckelordetawait
kan du vänta på resultatet av en asynkron operation. - Genom att använda
try...catch
blir 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.