Redux传奇:根传奇中从产量阵列到分叉的差异

Redux传奇:根传奇中从产量阵列到分叉的差异,redux,redux-saga,Redux,Redux Saga,新的传奇,我用在我的根传奇: function* rootSaga() { yield [ cycleRoot(), // fetches root cycleChain(), // fetch chain cycleChatBadge(), // fetches badge watchNotifications(), // navigate on ROOT_DONE watchNavigation(), /

新的传奇,我用在我的根传奇:

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。使用效果与直接调用传奇相比。

redux saga库可以直接处理生成程序,但是这种方法使得编写测试时很难使用模拟。相反,您可以使用
调用
效果。除了使用
调用
效果以声明方式编写外,此代码的工作原理与第一个代码片段完全相同。(另外,我在这里使用
all
效果,因为生成数组已被弃用)

要获得更深入的见解(包括测试示例),我建议阅读redux saga文档的这一部分:

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

2。使用
fork
而不是
call

第二个区别是,在第一个代码段中,您将阻止rootSaga的执行,直到所有saga都完成。要使它们非阻塞,您可以使用
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')
}
同样,您可以阅读文档中的非阻塞调用:


总之我建议在调用其他传奇时始终使用效果(如
调用
/
分叉
),并使用
分叉
效果启动根传奇中的其他传奇,除非有很好的理由阻止它。

感谢您的解释!因此,如果我的rootSaga只是在每个函数中有一组只包含
takeEvery
的观察程序,那么第二个区别就不重要了,因为观察程序都是立即执行的,并且没有阻塞?@wisdomtothman是的,takeEvery在内部使用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')
}