サーチ…
前書き
async
関数は、約束を返す関数です。約束が解決するまで発呼者に収穫をawait
から、結果を続行します。
イテレータを使用すると、 for-of
ループを使用してコレクションをループすることができます。
非同期イテレータは、各反復がfor-await-of
ループを使用しfor-await-of
ことができる約束であるコレクションです。
非同期イテレータはステージ3の提案です。彼らは--harmony-async-iteration
でChrome Canary 60に--harmony-async-iteration
構文
- 非同期関数* asyncGenerator(){}
- yieldはasyncOperationWhichReturnsAPromise()を待機します。
- await(asyncGenerator()の結果){/ *結果は約束からの解決された値* /}
備考
基本
JavaScript Iterator
は、 .next()
メソッドを持つオブジェクトvalue : <any>
これは、 value : <any>
でdone : <boolean>
オブジェクトであるIteratorItem
を返します。
JavaScript AsyncIterator
は.next()
メソッドを持つオブジェクトで、次の値の約束であるPromise<IteratorItem>
を返します。
AsyncIteratorを作成するには、 非同期ジェネレータの構文を使用します。
/**
* 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;
}
}
delayedRange
関数は最大数をとり、 AsyncIterator
を返します。これは、0からその数に1秒間隔で数を返します。
使用法:
for await (let number of delayedRange(10)) {
console.log(number);
}
for await of
loopは、新しいシンタックスの1つです。非同期関数だけでなく、非同期ジェネレータも使用できます。ループの中で、得られた値(Promisesであることを覚えておいてください)はアンラップされているので、Promiseは隠されています。ループの中で、あなたが直接値(得られた数値)を扱うことができる、 for await of
ループがあなたに代わって約束を待ちます。
上記の例では、ログが記録されるまで、1秒間、ログ0、別の秒間待機、ログ1などを待機します。その時点で、 AsyncIterator
が実行さdone
、 for await of
ループのAsyncIterator
が終了します。