8

babelの助けを借りて ES6 ジェネレーターを試していますが、コールバック ベースの非同期関数を効果的に使用してイテレーターを出力する方法 (またはその場合) を理解するのに苦労しています。

いくつかの URL を受け取り、それらを非同期にダウンロードし、ダウンロードしたらすぐに返す関数を書きたいとしましょう。以下のような文章が書けるようになりたいです。

let urls = ['http://www.google.com', 'http://www.stackoverflow.com' ];
for ( {url, data} of downloadUrls(urls) ) {
    console.log("Content of url", url, "is");
    console.log(data);
}

どうすれば実装できdownloadUrlsますか? 理想的には、次のように記述できるようになりたいと考えています。

var downloadUrls = function*(urls) {
    for( let url of urls ) {
        $.ajax(url).done( function(data) {
            yield data;
        });
    }
};

「yield」はコールバック内で呼び出され、ジェネレーター内で直接呼び出されないため、これはもちろん機能しません。同じことを試みている人々の多くの例をオンラインで見つけることができます。それらはあまり透明ではありません)、ブラウザ/ノードフラグを有効にする必要があるか、ノード固有の機能/ライブラリを使用しています。必要なものに最も近いライブラリはtask.jsのようですが、現在の Chrome で最も単純な例を実行することさえできません。

標準機能と現在の機能を使用して意図した動作を取得する方法はありasync/awaitますか?

4

3 に答える 3

0

標準および現在の機能を使用して意図した動作を取得する方法はありますか

はい、promise とジェネレーターを使用します。多くの promise ライブラリ、および一部のスタンドアロン ライブラリは、ジェネレーター「コルーチン」の使用を特徴としています。

ただし、 iteration と asynchrony を混在させることはできないことに注意してください。ジェネレーターはいずれかのみに使用できます。for ( {url, data} of downloadUrls(urls) ) {あなたの例はそれらを少し混乱させているようです-そのループが同期的に機能することを期待しているように見えますが、機能しません。

待つ必要がありasync/awaitますか?

いいえ、待つ必要はありません。Babel はすでにそれらをサポートしています

于 2015-04-17T12:58:43.903 に答える