Szukaj…
Wprowadzenie
Funkcja async to taka, która zwraca obietnicę. await dochód dla dzwoniącego, dopóki obietnica nie zostanie rozwiązana, a następnie kontynuowana z wynikiem.
Iterator pozwala na zapętlenie kolekcji za pomocą pętli for-of .
Iterator asynchroniczny to zbiór, w którym każda iteracja jest obietnicą, na którą można oczekiwać za pomocą pętli for-await-of .
Iteratory asynchroniczne to propozycja etapu 3 . Są w Chrome Canary 60 z --harmony-async-iteration
Składnia
- funkcja asynchroniczna * asyncGenerator () {}
- wydajność oczekuje na asyncOperationWhichReturnsAPromise ();
- for czekaj (pozwól wynikowi asyncGenerator ()) {/ * wynikiem jest rozwiązana wartość z obietnicy * /}
Uwagi
Iterator asynchroniczny to deklaratywny strumień ściągający, w przeciwieństwie do deklaratywnego strumienia wypychającego Observable.
Przydatne linki
Podstawy
JavaScript Iterator to obiekt z metodą .next() , która zwraca IteratorItem , czyli obiekt o value : <any> i done : <boolean> .
JavaScript AsyncIterator to obiekt z metodą .next() , która zwraca Promise<IteratorItem> , obietnicę dla następnej wartości.
Aby utworzyć AsyncIterator, możemy użyć składni generatora asynchronicznego :
/**
* 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;
}
}
Funkcja delayedRange przyjmuje maksymalną liczbę i zwraca AsyncIterator , który zwraca liczby od 0 do tej liczby, w 1 sekundowych odstępach.
Stosowanie:
for await (let number of delayedRange(10)) {
console.log(number);
}
Funkcja „ for await of pętlę” to kolejna część nowej składni, dostępna tylko w funkcjach asynchronicznych, a także w generatorach asynchronicznych. Wewnątrz pętli uzyskane wartości (które, pamiętajcie, są obietnicami) są rozpakowywane, więc obietnica jest ukryta. W obrębie pętli możesz poradzić sobie z wartościami bezpośrednimi (uzyskanymi liczbami), for await of pętlę będzie czekać na obietnice w twoim imieniu.
Powyższy przykład czeka 1 sekundę, log 0, kolejną sekundę, log 1 i tak dalej, aż loguje się 9. W tym momencie AsyncIterator zostanie done , a for await of pętlę zakończy się.