2016-08-04 7 views
0

我々はこのようなウォッチャーサガを書くように言われていますか?彼らはここで同じことをしませんか?利回り*デリゲート演算子は<a href="http://yelouafi.github.io/redux-saga/docs/introduction/BeginnerTutorial.html" rel="nofollow">Redux Sagas Beginner Tutorial</a>で

+3

'takeEvery'はイテレータを返し、' yield * 'はこのイテレータにデリゲートします。通常の「yield」は、このイテレータを呼び出し元に返します。 – ftor

+0

イテレータを呼び出し元に返すだけの欠点は何ですか?いずれにしても、イテレーターは使い果たされるまで実行されます。これは私が起こりたいことです。 – AjaxLeung

+0

発信者が自動的にジェネレータを呼び出すようです。多分、これはRedux Sagas特有の動作です。 – AjaxLeung

答えて

0

LUH3417によれば、takeEverはジェネレータなので、このインスタンスでは(委譲する)ことができます。ドキュメントから:

function* takeEvery(pattern, saga, ...args) { 
    while (true) { 
    const action = yield take(pattern) 
    yield fork(saga, ...args.concat(action)) 
    } 
} 

私の推測では、制御フローに関するものです。イテレータがtakeEvery以外の何かを生成することを気にしない場合、コントロールフローを完全に終了させる必要がある理由はありません。あなたのジェネレータが別のジェネレータに制御を渡す必要があった場合、戻ってきて、制御を渡すのがわかりましたが、あなたの例では、takeEveryに委譲する必要があるコード理由はありません。私が間違っている場合は、私に知らせてください。作曲サガから http://yelouafi.github.io/redux-saga/docs/advanced/ComposingSagas.html
http://yelouafi.github.io/redux-saga/docs/advanced/SequencingSagas.html
(Iこのページは、実際に追加されました今日)

+0

これは私の質問に答えていないようです。ジェネレータを実行するためにジェネレータに委任する必要はありません。なぜ、**単に 'yield'を使うのですか? – AjaxLeung

+0

私の推測では、制御フローです。イテレータがtakeEvery以外の何かを生成することを気にしない場合、コントロールフローを完全に終了させる必要がある理由はありません。あなたのジェネレータが別のジェネレータに制御を渡す必要があった場合、戻ってきて、制御を渡すのがわかりましたが、あなたの例では、takeEveryに委譲する必要があるコード理由はありません。私が間違っている場合は、私に知らせてください。 –

0

これらの2つのリンクが説明するのに役立つかもしれ

yield*のみタスクのシーケンシャルな構成を可能にし、一度に1つの発電機に*をつけるだけです。

私はまだ自分自身ですべてを試していますが、おそらくyield*takeEveryのアクションでは、サブタスク(例ではincrementAsync)が呼び出されますが、前のサブタスクが解決されると順次実行されます。 yieldを使用する場合は、すべてのINCREMENT_ASYNCアクションに対して、すぐにサブタスクを呼び出し、並列実行して解決します。

を使用するtakeLatestを使用すると、前の新しい要求をキャンセルするという点でtakeEveryと異なります。

+0

リンクが死んでいる、代わりにしてください。 – Marecky

関連する問題