Ricerca…
introduzione
Una funzione async
è quella che restituisce una promessa. await
rendimenti al chiamante fino a quando la promessa non si risolve e poi continua con il risultato.
Un iteratore consente di eseguire il looping della raccolta con un ciclo for-of
.
Un iteratore asincrono è una raccolta in cui ogni iterazione è una promessa che può essere attesa utilizzando un ciclo for-await-of
.
Gli iteratori asincroni sono una proposta di stage 3 . Sono in Chrome Canary 60 con --harmony-async-iteration
Sintassi
- funzione asincrona * asyncGenerator () {}
- rendimento attendi asyncOperationWhichReturnsAPromise ();
- in attesa (lascia risultato da asyncGenerator ()) {/ * risultato è il valore risolto dalla promessa * /}
Osservazioni
Un iteratore asincrono è un flusso di tiro dichiarativo in opposizione al flusso di spinta dichiarativo di un osservabile.
link utili
Nozioni di base
Un Iterator
JavaScript è un oggetto con un metodo .next()
, che restituisce un oggetto IteratorItem
, che è un oggetto con value : <any>
e done : <boolean>
.
Un AsyncIterator
JavaScript è un oggetto con un metodo .next()
, che restituisce una Promise<IteratorItem>
, una promessa per il valore successivo.
Per creare un AsyncIterator, possiamo usare la sintassi del generatore asincrono :
/**
* 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;
}
}
La funzione delayedRange
richiederà un numero massimo e restituirà un AsyncIterator
, che produce numeri da 0 a quel numero, in intervalli di 1 secondo.
Uso:
for await (let number of delayedRange(10)) {
console.log(number);
}
L' for await of
ciclo è un'altra parte della nuova sintassi, disponibile solo all'interno delle funzioni asincrone e dei generatori asincroni. All'interno del ciclo, i valori restituiti (che, ricordate, sono le Promesse) sono scartati, quindi la Promessa è nascosta. All'interno del ciclo, puoi gestire i valori diretti (i numeri ottenuti), l' for await of
ciclo attenderà le Promesse per tuo conto.
L'esempio sopra attenderà 1 secondo, log 0, aspetta un altro secondo, log 1, e così via, fino a quando non registra 9. A quel punto l' AsyncIterator
sarà done
, e l' for await of
ciclo uscirà.