2017-01-10 40 views
7

私は、ジェネレータ関数を待たずに使用することができないという痛ましい実現に直面しました。プロミスまたは非同期機能のみ。ジェネレータからAsync/Awaitへの移行

私のチームは、メインjsファイルのCoモジュールを1回呼び出すだけで、ジェネレータ機能からなるすべてのモジュールでアプリケーション全体を構築しました。

何百もの発電機機能を持ち、function*(...){からasync function(...){に変更する以外に、どのようにして発電機をasync/awaitで動作させることができますか?

yield */generatorsとasync/awaitがフローを処理する方法がかなり似ているので意味がないので、サポートジェネレータを待っているのを見逃してしまったのかと思っています。

+1

FYI、 'async/await'はES7の一部ではありません。 –

+1

また、コードベースの大部分を書き直したい場合は、可能であればツールを使用してください。https://github.com/facebook/jscodeshift(免責事項:私が書いたもの) –

+0

移行の理由? –

答えて

5

コードベースを調べて変更する必要があります(もちろん、あなたのためにすべてを行うツールを作成/使用する必要があります)。

しかし、あなたが望むなら、あなたは徐々にそれを行うことができます。すべてのyieldawait co(…)によってawait、すべてのyield*によってその中に、async functionによってfunction*を交換し、その後、…()co(…)から旧ジェネレータ関数を呼び出すたびに変更します。

3

asyncの機能とco libraryが平和に共存できるため、1つずつ移行する必要はありません。

async機能がcoジェネレータ関数の内部で使用することができ、彼らは約束を返す関数です。しかし行くほか

(async function() { 
    await co(genFn(1)); 
    // for generator functions with no arguments, can also be 
    await co(genFn); 
})() 
.catch(console.error); 

co.wrap(function*() { 
    yield asyncFn(1); 
})() 
.catch(console.error); 

ジェネレータ機能がasync関数内で使用することができます数百のジェネレータ関数を変更してそれらを変更する*(...){から非同期関数(...){、how e lseは発電機 をasync/awaitと連携させることができますか?

発電機がcoとの関連でのみアプリケーションで使用されていることを考慮すると、それらは自動的に交換することができます。 function*および*の方法は、asyncの対応物に置き換えられ、yieldおよびyield*は、awaitで置き換えられる。

これを行う前に、いくつかの予備リファクタリングを行う必要があります。 this list of yieldablesからは、約束と発電機のみを使用してください。並列実行(配列やオブジェクト)はそれぞれPromise.allと置き換えなければならない:

const results = yield [...]; 

const results = yield Promise.all([...]); 
+0

"co"はどこから来たのですか? – delete

+1

@delete https://github.com/tj/coから。答えへのリンクを追加しました。あなたが今投稿した質問に答えてくれると思います。 – estus

関連する問題