传奇的新手,我在我的根传奇中使用了它:
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);
...
}
点燃根传奇时,两者之间有何不同?
答案 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除非有充分的理由阻止它,否则就不要根传说。