2017-03-21 5 views
7

以下の2つのアプローチの違いは何でしょうか?redux-sagaいつフォークを使用しますか?

export function* watchLoginUser() { 
    yield takeEvery(USER_LOGIN, loginUser) 
} 
export function* watchLogoutUser() { 
    yield takeEvery(USER_LOGOUT, logoutUser) 
} 
export function* watchGetParties() { 
    yield takeEvery(PARTIES_GET, getParties) 
} 
export default function* root() { 
    yield [ 
    fork(watchLoginUser), 
    fork(watchLogoutUser), 
    fork(watchGetParties) 
    ] 
} 
export default function* root() { 
    yield [ 
    takeEvery(USER_LOGIN, loginUser), 
    takeEvery(USER_LOGOUT, logoutUser), 
    takeEvery(PARTIES_GET, getParties) 
    ] 
} 

は、ときに私がいないときにフォークとを使用する必要がありますか?

答えて

15

一般的に、forkは、サガが非ブロッキングタスクを開始する必要がある場合に便利です。ノンブロッキングとは、呼び出し元がタスクを開始し、完了するのを待つことなく実行を継続することを意味します。

あり、これは有用であり得る様々な状況があるが、2主なものである:できるようにするために、タスクへの参照を保持する論理ドメインによってサーガ

  • グルーピング

    • キャンセル/参加する

    あなたの最上位のサガは、最初のユースケースの例です。

    yield takeEvery(USER_REQUESTED_LOGIN, authenticateUser); 
    yield takeEvery(USER_REQUESTED_LOGOUT, logoutUser); 
    
    forkとサガを呼び出します。この例では、あなたが提案するものと同等であることがわかります

    は、降伏:

    yield fork(authSaga); 
    yield fork(myDomainSpecificSaga); 
    // you could use here something like yield []; 
    // but it wouldn't make any difference here 
    

    はどこauthSaga可能性が高いようなものが含まれます:あなたはおそらくのようなものがあるでしょうtakeEvery呼び出し。しかし実際には、コード編成の目的でのみこれを行う必要があります。 takeEveryはそれ自体が分岐タスクなので、ほとんどの場合、これは無用に冗長になります。あなたが発信者サガが再開、およびにUSER_SIGNED_OUTアクションに待機するようになっている間monitorUserProfileUpdatesが実行されることを、この例では見ることができます

    yield take(USER_WAS_AUTHENTICATED); 
    const task = yield fork(monitorUserProfileUpdates); 
    yield take(USER_SIGNED_OUT); 
    yield cancel(task); 
    

    二ユースケースの例は次のようなものになるだろう派遣される。また、必要に応じてキャンセルするために参照を保持することもできます。

    完全にするために、ノンブロッキングコールを開始する別の方法があります:spawnforkspawnは、エラーとキャンセルが子供から親サーガにどのようにバブルするかが異なります。

  • +0

    すばらしい説明、ありがとう! –

    関連する問題