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
/await
wordt de codeflow intuïtiever dan met gebruik vanPromise
-ketens (then
ofcatch
), waardoor het kan worden geschreven als synchrone verwerking. -
Eenvoudige foutafhandeling: Het gebruik van
try...catch
vereenvoudigt 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 sleutelwoordawait
te gebruiken, kunt u wachten op het resultaat van een asynchrone bewerking. - Door
try...catch
te gebruiken, wordt foutafhandeling in asynchrone bewerkingen eenvoudiger. - Door
Promise.all
te 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.