Async/await in TypeScript
Dit artikel legt async/await uit in TypeScript.
YouTube Video
Async/await in TypeScript
Async is in TypeScript een keyword om asynchrone operaties bondig te beschrijven en werkt vergelijkbaar met de async/await-syntaxis in JavaScript. Async functies zijn ontworpen om het werken met functies die Promises retourneren intuïtiever te maken.
Basisprincipes van async functies
Functies die met het async keyword worden gedeclareerd, retourneren altijd een Promise. Hier is een eenvoudig voorbeeld:.
1async function fetchData(): Promise<string> {
2 return "Data received";
3}
4
5fetchData().then((data) => console.log(data)); // "Data received"
In dit voorbeeld, omdat de async functie altijd een Promise retourneert, wordt de geretourneerde waarde automatisch opgelost met Promise.resolve. Met andere woorden, "Data received" wordt een Promise<string> en wordt behandeld als een asynchrone operatie.
Het await keyword
Het await keyword kan alleen worden gebruikt binnen een async functie. Hiermee kun je pauzeren en wachten op het resultaat van een Promise voordat je verdergaat met de uitvoering van de functie.
In het volgende voorbeeld wordt asynchrone verwerking met fetch geschreven met 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();In dit voorbeeld wordt await gebruikt om te wachten op de voltooiing van de Promise die door de fetch functie wordt geretourneerd, en het resultaat wordt toegewezen aan de variabele response. Daarnaast wordt ook het resultaat van response.json() afgewacht.
Foutafhandeling met async/await
Fouten die optreden tijdens asynchrone verwerking kunnen worden opgevangen met behulp van de standaard try...catch-syntaxis. Als er een fout optreedt bij het await gedeelte, wordt die fout afgehandeld in het catch blok.
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();In het bovenstaande voorbeeld wordt het resultaat van de fetch functie afgewacht met await, en als er een fout optreedt wordt het afgehandeld met try...catch.
Voordelen van async/await
-
Intuïtieve asynchrone verwerking: Met
async/awaitwordt de codeflow intuïtiever dan met gebruik vanPromise-ketens (thenofcatch), waardoor het kan worden geschreven als synchrone verwerking. -
Eenvoudige foutafhandeling: Het gebruik van
try...catchvereenvoudigt foutafhandeling in asynchrone operaties. Je kunt leesbaardere code schrijven dan met gebruik vanPromise-ketens.
Retourwaarden van async functies
Een async-functie retourneert altijd een Promise. Daarom is asynchrone verwerking mogelijk met behulp van het sleutelwoord async, zelfs zonder expliciet een Promise terug te geven.
1async function example() {
2 return 42;
3}
4
5example().then((result) => console.log(result)); // 42
In de bovenstaande code wordt een synchrone waarde 42 geretourneerd, maar aangezien het zich in een async-functie bevindt, wordt het automatisch omgezet in Promise.resolve(42).
Sequentiële uitvoering van asynchrone functies
Bij het uitvoeren van meerdere asynchrone functies achter elkaar kunt u await gebruiken om hun volgorde te regelen.
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();In dit voorbeeld wordt fetchData2 uitgevoerd na het wachten tot fetchData1 is voltooid. Dit is beter leesbaar in vergelijking met het gebruik van een Promise-keten.
Parallelle uitvoering
Als u asynchrone bewerkingen parallel wilt uitvoeren, kunt u Promise.all gebruiken om meerdere Promises gelijktijdig te verwerken.
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();In dit geval worden fetchData1 en fetchData2 tegelijkertijd uitgevoerd, en gaat het proces verder nadat beide zijn opgelost. Dit maakt een efficiënte afhandeling van meerdere asynchrone bewerkingen mogelijk.
Samenvatting
- Een
async-functie retourneert eenPromise, en door het sleutelwoordawaitte gebruiken, kunt u wachten op het resultaat van een asynchrone bewerking. - Door
try...catchte gebruiken, wordt foutafhandeling in asynchrone bewerkingen eenvoudiger. - Door
Promise.allte gebruiken, is het mogelijk om meerdere asynchrone bewerkingen parallel uit te voeren.
async/await wordt veel gebruikt in TypeScript en JavaScript omdat het een eenvoudigere beschrijving van asynchrone bewerkingen mogelijk maakt.
Je kunt het bovenstaande artikel volgen met Visual Studio Code op ons YouTube-kanaal. Bekijk ook het YouTube-kanaal.