Zoeken…
Invoering
Een async
functie is er een die een belofte teruggeeft. await
opbrengsten op de beller af totdat de belofte is opgelost en vervolgens doorgaat met het resultaat.
Met een iterator kan de verzameling worden doorgelust met een for-of
lus.
Een async-iterator is een verzameling waarbij elke iteratie een belofte is waarop kan worden gewacht met behulp van een lus in for-await-of
.
Async iterators zijn een fase 3-voorstel . Ze zijn in Chrome Canary 60 met --harmony-async-iteration
Syntaxis
- async-functie * asyncGenerator () {}
- opbrengst wacht asyncOperationWhichReturnsAPromise ();
- voor wachten (resultaat van asyncGenerator ()) {/ * resultaat is de opgeloste waarde van de belofte * /}
Opmerkingen
Een asynchrone iterator is een declaratieve pull-stream in tegenstelling tot de declaratieve push- stream van Observable.
handige links
Basics
Een JavaScript Iterator
is een object met de methode .next()
, die een IteratorItem
retourneert, een object met de value : <any>
en done : <boolean>
.
Een JavaScript AsyncIterator
is een object met de methode .next()
, die een Promise<IteratorItem>
retourneert, een belofte voor de volgende waarde.
Om een AsyncIterator te maken, kunnen we de syntaxis van de async-generator gebruiken :
/**
* Returns a promise which resolves after time had passed.
*/
const delay = time => new Promise(resolve => setTimeout(resolve, time));
async function* delayedRange(max) {
for (let i = 0; i < max; i++) {
await delay(1000);
yield i;
}
}
De functie delayedRange
neemt een maximumaantal en retourneert een AsyncIterator
, die getallen oplevert van 0 tot dat nummer, met intervallen van 1 seconde.
Gebruik:
for await (let number of delayedRange(10)) {
console.log(number);
}
De for await of
loop is een nieuw stukje nieuwe syntax, alleen beschikbaar binnen async-functies, evenals async-generators. Binnen de lus worden de toegekende waarden (wat, denk eraan, beloften zijn) uitgepakt, dus de belofte is verborgen. Binnen de lus kun je omgaan met de directe waarden (de toegekende getallen), de for await of
lus wacht namens jou op de beloften.
Het bovenstaande voorbeeld wacht 1 seconde, log 0, wacht nog een seconde, log 1, en ga zo maar door, totdat hij logt 9. Op welk punt de AsyncIterator
zal worden done
, en het for await of
lus af te sluiten.