代码之家  ›  专栏  ›  技术社区  ›  Guy

redux saga:根saga中的yield数组与fork之间的差异

  •  3
  • Guy  · 技术社区  · 6 年前

    刚接触到Saga,我在我的根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 回复  |  直到 6 年前
        1
  •  3
  •   Martin Kadlec    6 年前

    这里实际上有两个不同之处。

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

    ReduxSaga库可以直接处理产生的生成器,但是这种方法使得在编写测试时很难使用mock。相反,您可以使用 call 效果。除了使用声明性的 呼叫 效果。(另外,我正在使用 all 此处的效果,因为生成数组已被弃用)。

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

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

    你可以使用 呼叫 调用函数和Sagas的效果。但是,如果您对编写测试不感兴趣并且确信永远不会这样做,我发现使用 呼叫 区分调用Sagas的效果(使用 呼叫 )和常规函数(直接调用)。

    2。使用 fork 而不是 呼叫

    第二个区别是,在第一个代码片段中,您将阻止rootsaga执行,直到所有的saga都完成。要使它们不阻塞,可以使用 效果。

    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

    总之 我建议总是使用效果(比如 呼叫 / )当调用其他传奇并使用 除非有充分的理由阻止它,否则会对启动根下垂中的其他下垂产生影响。