Async/await in JavaScript

Async/await in JavaScript

In dit artikel leggen we async/await in JavaScript uit.

YouTube Video

Async/await in JavaScript

async (en await) in JavaScript zijn functies ontworpen om het schrijven van asynchrone operaties intuïtiever en leesbaarder te maken. Door dit te gebruiken kun je de complexiteit van traditionele callbackfuncties en Promise-ketens verminderen, en asynchrone code schrijven op een manier die lijkt op synchrone code.

async Functie

async wordt gebruikt om een functie als een asynchrone functie te definiëren. Een async functie retourneert altijd een Promise. Binnen een functie gemarkeerd met async kun je await gebruiken om te wachten tot het resultaat van een Promise wordt geretourneerd.

Basis Syntax van een async Functie

1async function myAsyncFunction() {
2    // Write asynchronous processing here
3    return 'Result';  // Return a Promise
4}

In dit geval retourneert het aanroepen van myAsyncFunction() automatisch een Promise-object. Wanneer de Promise wordt opgelost, wordt het resultaat de waarde die door return wordt geretourneerd.

Voorbeeld: Basis async Functie

1async function greet() {
2    return 'Hello, World!';
3}
4
5greet().then((message) => {
6    console.log(message);  // Displays "Hello, World!"
7});

await

await wordt gebruikt om te wachten totdat een Promise wordt opgelost. Door await te gebruiken, kun je de uitvoering pauzeren totdat de Promise is opgelost en het resultaat van de Promise ontvangen. await kan alleen worden gebruikt binnen een async functie.

Voorbeeld: Hoe await te gebruiken

 1async function fetchData() {
 2    // Wait for the result of the Promise
 3    const data = await fetch('https://codesparklab.com/json/example.json');
 4    // Wait for the asynchronous operation to complete
 5    const jsonData = await data.json();
 6    // Retrieve and display the data
 7    console.log(jsonData);
 8}
 9
10fetchData();

In het bovenstaande voorbeeld wacht het met await op de Promise die door de fetch functie wordt geretourneerd, en voert vervolgens verdere asynchrone bewerkingen uit met het resultaat.

Foutenafhandeling met async/await

Als er een fout optreedt binnen een async functie, wordt die fout behandeld als een reject van de Promise. Je kunt try...catch-instructies gebruiken om fouten af te handelen.

Voorbeeld: Foutenafhandeling

 1async function fetchData() {
 2    try {
 3        // Invalid URL
 4        const data = await fetch('https://api.invalid-url.com/data');
 5        const jsonData = await data.json();
 6        console.log(jsonData);
 7    } catch (error) {
 8        // Catch the error
 9        console.error('Failed to fetch data:', error);
10    }
11}
12
13fetchData();

Het gebruik van een try...catch-blok stelt je in staat fouten op te vangen die optreden tijdens asynchrone operaties, waardoor wordt voorkomen dat het programma crasht wanneer er fouten optreden.

Voordelen van async/await

In vergelijking met traditionele Promise-ketens biedt async/await de volgende voordelen:.

  • Verbeterde leesbaarheid
    • Asynchrone verwerking kan worden geschreven als synchrone code, waardoor de complexiteit van diep geneste Promise-ketens en callbacks wordt vermeden.
  • Eenvoudiger debuggen
    • Omdat het lijkt op synchrone code, wordt debuggen en foutafhandeling eenvoudiger.
  • Betere onderhoudbaarheid
    • Asynchrone processen kunnen eenvoudiger worden geschreven, waardoor het makkelijker wordt om de code aan te passen of te wijzigen en de lange termijn onderhoudbaarheid wordt verbeterd.

Voorbeeld: Promise-keten versus async/await

Laten we code vergelijken die gebruikmaakt van Promise-ketens en code die gebruikmaakt van async/await.

 1// Code using Promise chains
 2function fetchDataPromise() {
 3    fetch('https://codesparklab.com/json/example.json')
 4        .then((response) => response.json())
 5        .then((data) => {
 6            console.log(data);
 7        })
 8    .catch((error) => {
 9        console.error('Failed to fetch data:', error);
10    });
11}
12
13// Code using async/await
14async function fetchDataAsync() {
15    try {
16        const response = await fetch('https://codesparklab.com/json/example.json');
17        const data = await response.json();
18        console.log(data);
19    } catch (error) {
20        console.error('Failed to fetch data:', error);
21    }
22}

Zoals je kunt zien, kun je met async/await asynchrone processen op een lineaire manier schrijven, wat resulteert in beter leesbare code.

Meerdere asynchrone bewerkingen tegelijkertijd uitvoeren

Door Promise.all() of Promise.race() te combineren met await, kun je meerdere asynchrone bewerkingen tegelijkertijd uitvoeren en hun resultaten gezamenlijk afhandelen.

Promise.all()

 1async function fetchMultipleData() {
 2    try {
 3        const [data1, data2] = await Promise.all([
 4            fetch('https://codesparklab.com/json/example1.json'),
 5            fetch('https://codesparklab.com/json/example2.json')
 6        ]);
 7        const jsonData1 = await data1.json();
 8        const jsonData2 = await data2.json();
 9        console.log(jsonData1, jsonData2);
10    } catch (error) {
11        console.error('Failed to fetch data:', error);
12    }
13}
14
15fetchMultipleData();
  • Promise.all() lost meerdere Promises tegelijkertijd op en retourneert hun resultaten als een array. Het wacht tot alle Promises zijn opgelost, en als een van hen mislukt, wordt het als een algehele mislukking beschouwd.

Promise.race()

 1async function fetchFastestData() {
 2    try {
 3        const fastestResponse = await Promise.race([
 4            fetch('https://codesparklab.com/json/example1.json'),
 5            fetch('https://codesparklab.com/json/example2.json')
 6        ]);
 7        const jsonData = await fastestResponse.json();
 8        console.log('Fastest data:', jsonData);
 9    } catch (error) {
10        console.error('Fetch error:', error);
11    }
12}
13
14fetchFastestData();
  • Beloof.race(). Het is handig wanneer u wilt reageren op welke asynchrone operatie het eerst voltooid. Echter, als de eerste Belofte mislukt, de fout wordt onmiddellijk gevangen door.

Promise.allSettled()

 1async function fetchWithAllSettled() {
 2    const results = await Promise.allSettled([
 3        fetch('https://codesparklab.com/json/example1.json'),
 4        fetch('https://invalid-url.com/404')  // This URL will fail
 5    ]);
 6
 7    results.forEach((result, index) => {
 8        if (result.status === 'fulfilled') {
 9            console.log(`Request ${index + 1} succeeded:`, result.value.url);
10        } else {
11            console.warn(`Request ${index + 1} failed:`, result.reason);
12        }
13    });
14}
15
16fetchWithAllSettled();
  • Beloof.allSettled() wacht op alle resultaten, ongeacht succes of mislukking. Elk resultaat wordt teruggegeven in de vorm van "{status, waarde}" of "{status, reden}," zodat u kunt bepalen welke beloftes zijn geslaagd en welke niet.

Promise.any()

 1async function fetchAnySuccessful() {
 2    try {
 3        const firstSuccessful = await Promise.any([
 4            fetch('https://invalid-url.com/404'),  // This URL will fail
 5            fetch('https://codesparklab.com/json/example1.json')
 6        ]);
 7        const jsonData = await firstSuccessful.json();
 8        console.log('First successful response:', jsonData);
 9    } catch (error) {
10        console.error('All fetch requests failed:', error);
11    }
12}
13
14fetchAnySuccessful();
  • Beloofd. Een uitzondering wordt alleen gegooid als alle Beloftes falen. Het kan worden gebruikt als een retry mechanisme in omgevingen waar sommige API's onbetrouwbaar zijn totdat men slaagt.

Samenvatting

  • async-functie: Retourneert altijd een Promise en wordt gebruikt om asynchrone verwerking te schrijven.
  • await: Gebruikt om te wachten tot een Promise wordt opgelost en het resultaat te ontvangen.
  • Foutenafhandeling: Gebruik try...catch om fouten die tijdens asynchrone verwerking optreden af te handelen.
  • Meerdere asynchrone operaties**: Door gebruik te maken van methoden zoals.

async/await zijn krachtige tools voor het omgaan met asynchrone verwerking, dus zorg ervoor dat je ze gebruikt om complexe asynchrone logica te vereenvoudigen.

Je kunt het bovenstaande artikel volgen met Visual Studio Code op ons YouTube-kanaal. Bekijk ook het YouTube-kanaal.

YouTube Video