Promise<Iterator<Item>>
またはIterator<Promise<Item>>
?
どちらもありません。まだ承認されていませんが、現在の実装は何か他のものを返します。 Kris Kowalはwritten an about async generators、参考文献はJafar Husain's AsyncGenerator proposal for ES7です。 編集:tc39 proposalとbabel support!
のは、いくつかの種類(単純化)を定義してみましょう:
interface Iterator<T> {
Iteration<T> next();
}
type Iteration<T> = { done: boolean, value: T }
私たちは、このように使用することができます何かを探しています:
for (;;) {
var iteration = await async_iterator.next();
if (iteration.done) {
return iteration.value;
} else {
console.log(iteration.value);
}
}
Iterator<Promise<T>>
は、値が約束されている同期反復を生産しています。それはこのように使用することができます:
for (;;) {
var iteration = iterator_promise.next();
if (iteration.done) {
return await iteration.value;
} else {
console.log(await iteration.value);
}
}
Promise<Iterator<T>>
は、将来的に開始し、普通の同期イテレータです:
var iterator = await promise_iterator;
for (;;) {
var iteration = iterator.next();
if (iteration.done) {
return iteration.value;
} else {
console.log(iteration.value);
}
}
そうもないIterator<Promise<T>>
もPromise<Iterator<T>>
は適していました。完全に理にかなって
interface AsyncIterator<T> {
Promise<Iteration<T>> next();
}
:現在、非同期発電機ではなくAsyncIterator
sを返します。イテレータの次の要素に移動することは非同期操作であり、これは私たちが望むのと全く同じように使用できます。
どのように非同期ジェネレータを消費しますか?
Babeljs.ioは既に非同期ジェネレータをコンパイルします。 Babeljs.io/repl example:
EDIT:バベル6、babel-plugin-transform-regenerator
は{asyncGenerators:true}
オプションでそれをサポートしていますので、babeljs.ioにはプリセットは非同期発電機をコンパイルします。
EDIT:transform-async-generator-functions
バベル6プラグインを参照してください。
function delay(timeout, val) {
return new Promise(resolve => setTimeout(resolve, timeout, val));
}
async function* asyncGenerator() {
for (var i = 0; i < 5; i++) {
await delay(500);
yield i;
}
}
async function forAwait(iter, fn) {
for (;;) {
let iteration = await iter.next();
if (iteration.done) return iteration.value;
await fn(iteration.value);
}
}
async function main() {
console.log('Started');
await forAwait(asyncGenerator(), async item => {
await delay(100);
console.log(item);
});
console.log('End');
}
main();
(Async iterationで説明)非同期イテレータのための便利なfor await
ループのための提案があります:
for await (let line of readLines(filePath)) {
print(line);
}
更新:
残念ながら、async-await
はの一部にはなりませんでしたが、 ECMAScript 2016。少なくともawait
は、将来の使用のための予約語として言及されている。
更新:
関連の提案:
うーむ、非同期/ await'提案はまだない 'として、この質問に答えるには早すぎます承認された – thefourtheye
非同期イテレータ - sp cがあります - 私はモバイルになっていますが、ほとんどの場合既に決定されています。それは '次の'が約束を返すジェネレータです。 –