2017-11-28 17 views
0

私はサガから別のサガを呼びたい。redux-sagaでyield * vs yieldをいつ使うべきですか?

もちろん、サガはジェネレータ関数であり、非同期です。

私はいつもyield *のユーザーか、またはいつもyieldを使用する必要がありますか?

function* mySaga({ payload: { id, name } }) { 
    yield myOtherAsyncSaga(); // when to use yield *? 
} 
+0

書かれているように、あなたの 'mySaga()'ジェネレータは、他のジェネレータの結果を1つだけ返します。 'yield *'のポイントは、他のジェネレータに効果的に委譲し、完了するまですべての結果を返すことです。委任ジェネレータは、その前後に独自の値を生成できます。 – Pointy

+0

ジェネレータが単一の結果しか返さない場合、 'yield'は' yield * 'と振る舞いが同じですか? – Ben

+1

それは私の理解です、そうです。いくつかの簡単なテスト機能で実験的に検証するのはかなり簡単です。 – Pointy

答えて

1

佐賀はもちろんジェネレータ関数であり、非同期です。
私はいつも利回り*を取るべきでしょうか?いつも利回りを使うべきですか?

完全に質問に答えるには、まず、サガ、ミドルウェア、プロセスマネージャー、ジェネレーター機能が一般的に機能すると理解する必要があります。実際にはredux-sagaは、カスタムアクションをインターセプトして注入するreduxストア用のミドルウェアと、独自のティックコールバックドメインを持ち、非同期アクションの実行に役立つ2つの側面を実装しています。

次に、すべてのクライアント実装のサガ機能は、ちょうどeffect creatorです。実際にはクライアントのサガ機能は実際には何もしませんが、効果の作成 - calltakeputなどが実装されています。また、サガは本質的に同期または非同期ではありません - サガプロセスマネージャそれは要求されたアクション(例えば、約束を待つ)を実行する。
もちろん、クライアントのサガでプロミス/非同期処理を手動で実行することはできますが、そのようなアクションはサガイベントサイクルから外れます。

ので、redux-saga内部には、適切な効果を返すと、おそらく閉鎖アクティベーションコンテキストにいくつかの情報を格納する、ちょうどan iteratorするクライアントサガから望んでいる - while(true)の場合 - 佐賀プロセスのように。したがって、redux-sagaにはユークリッドケースがありません。yield *が必須です。yield *は、それ以降のイテレータを上位レベルに再委任したものです。

関連する問題