5

ES6 には、イテレータを返すジェネレータがあります。

function* range(n) {
    for (let i = 0; i < n; ++i) {
        yield i;
    }
}

for (let x of range(10)) {
    console.log(x);
}

Promisesを返す非同期関数の提案があります。

async function f(x) {
    let y = await g(x);
    return y * y;
}

f(2).then(y => {
    console.log(y);
});

この 2 つを組み合わせると、次のようになります。

async function* ag(n) {
    for (let i = 0; i < n; ++i) {
         yield i;
    }
}

それは何を返しますか?ですかPromise<Iterator<Item>>Iterator<Promise<Item>>? 他の何か?どのように消費するのですか?対応するループが必要だと思いforます。結果を非同期に反復するものは次のようになります。

for (await let x of ag(10)) {
    console.log(x);
}

次のアイテムにアクセスしようとする前に、各アイテムが利用可能になるのを待ちます。

4

2 に答える 2

0

考えてみてください: イテレータ関数には戻り値がないため、それらを非同期にしても意味がありません。次に、これら 2 つのアプローチの間には、この概念上のギャップがあります。- イテレーターはプルベースです: イテレーターを呼び出して、新しい値の計算を呼び出します - Promise はプッシュベースです: Promise は結果をそのリスナーにプッシュします。(一度または決して)

場合によっては、Iterator<Pomise<Item>>

function* f(g){
    for(...){
        let y = await g();
        yield y;
    }
}

Iterator を Promise にラップすることが理にかなっているケースは考えられません。定義からイテレーターをインスタンス化する際に非同期は何もないためです。

于 2016-01-09T13:50:11.527 に答える