Redux Saga:收益阵列要在根Saga中进行分叉的区别

时间:2018-12-16 00:55:15

标签: redux redux-saga

传奇的新手,我在我的根传奇中使用了它:

function* rootSaga() {
    yield [
        cycleRoot(), // fetches root
        cycleChain(), // fetch chain
        cycleChatBadge(), // fetches badge
        watchNotifications(), // navigate on ROOT_DONE
        watchNavigation(), // listen to navigation changes
        watchAppState(), // background/foreground
        watchConnection(), // connection chages
    ];
}

有效。但是我看过使用以下示例:

function* rootSaga() {
    yield fork (cycleRoot);
    yield fork (cycleChain);
    ...
}

点燃根传奇时,两者之间有何不同?

1 个答案:

答案 0 :(得分:3)

这里实际上有两个区别。

1。使用效果与直接调用Sagas。

redux-saga库可以直接处理yield生成器,但是这种方法使得编写测试时很难使用模拟。相反,您可以使用call效果。除了使用call效果声明性地编写代码外,此代码将与您的第一个代码段完全相同。 (此外,由于不建议使用产生数组,因此我在这里使用all效果。

function* rootSaga() {
    yield all([
        call(cycleRoot), 
        call(cycleChain),
        ...
    ]);
}

对于更深入的见解(包括测试示例),我建议阅读redux-saga文档的这一部分:https://redux-saga.js.org/docs/basics/DeclarativeEffects.html

您可以使用call效果来调用函数和sagas。但是,如果您对编写测试不感兴趣并且确定永远不会,我发现使用call效果来区分调用sagas(使用call)和常规函数(直接调用)很有用。

2。使用fork代替call

第二个区别是,在您的第一个代码段中,您将阻止rootSaga执行,直到所有sagas完成为止。要使其不受阻碍,您可以使用fork效果。

function* rootSaga() {
    yield all([
        call(cycleRoot), 
        call(cycleChain),
        ...
    ]);
    console.log('This happens only after all sagas are finished (including fetching etc.')
}

function* rootSaga() {
    yield all([
        fork(cycleRoot), 
        fork(cycleChain),
        ...
    ]);
    console.log('This happens immediately after the sagas are executed - it does not wait for async action like fetching')
}

同样,您可以阅读文档中的非阻塞呼叫:https://redux-saga.js.org/docs/advanced/NonBlockingCalls.html

总结,我建议在调用其他Sagas时始终使用效果(例如call / fork),并使用fork效果来启动其他Sagas除非有充分的理由阻止它,否则就不要根传说。