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à.