サーチ…
前書き
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が終了します。