2017-05-08 34 views
1

一連の要素を返すJSジェネレータ関数を用意したいと思います。それはいくつかの料理の名前を知っていますが、もし私が好きでなければ、リモートサーバーからより多くの提案を取り出す必要があります。だから私はこれを働かせたいです:非同期に動作するジェネレータ関数

const dishSuggestions = function*(){ 
    yield "pancakes"; 
    yield "pizza"; 
    fetchMealSuggestions().then(suggestions => { // Or even better await. 
    for (const suggestion of suggestions) 
     yield suggestion; 
    }); 
}; 

これは私が内部関数から降伏することはできませんので、明らかに動作しません。だから私の質問は:どのようにその行動を取得するか?私はできますか?またはこれは間違ったツールですか?

+0

[この非同期コールバックをジェネレータに変換するにはどうすればいいですか?](http://stackoverflow.com/q/29280189/1048572) - 答えはNoです。約束と反復子は混合。 – Bergi

答えて

2

この場合、非同期イテレータを含む非同期生成器が必要です。ここで

は、それがどのように見えるかです:

// Note the * after "function" 
async function* dishSuggestions() { 
    yield "pancakes"; 
    yield "pizza"; 

    // async iteration: yield each suggestion, one after the other 
    for await (const meal of fetchMealSuggestions()) { 
    yield meal; 
    } 
} 

async function logDishes() { 
    for await (const dish of dishSuggestions()) { 
    console.log(dish); 
    } 
} 

logDishes(); 

はここ working transpilled demo with Babelです。

fetchMealSuggestionsは、非同期反復が動作するための非同期イテレータも返さなければならないことに注意してください。

これはまだ、各ブラウザで出荷を開始したまったく新しい機能です。今の

More details

、コメントでquestion Bergi recommendedを見てみましょう。

+1

これは素晴らしい解決策です。 – trincot

+1

私は非同期ジェネレータがAPIの標準になることを楽しみにしています。ストリームベースの操作を約束の領域にもたらす、非常に強力で簡潔な方法です。 –

関連する問題