什么是 Redux saga 的更好结构

what is a better structure for Redux saga

我想过saga的结构,想出了一个办法,不知道对不对。

比如我有多个saga文件,对于每个典型的saga文件,都有一个watcher saga监视不同的动作"concurrently",然后我们只需要默认导出这个watcher saga即可。

这是我的初步做法:

我不确定我对 watcher sagas 进行分组的方式

/**
* saga.js
* 
* one watcher saga watch multiple actions concurrently
* However, from my research, I can only see that everyone seems to create 
* multiple watcher sagas, and each watcher only watch single action which is 
* sort of verbose
*/
function* watchSomething() {  
  yield all([
    takeLatest(GET_SOMETHING, callGetSomething),
    takeLatest(GET_SOMETHING_2, callGetSomething_2),
    takeLatest(GET_SOMETHING_3, callGetSomething_3),
  ]);
}
export default watchSomething;

/**
* rootSaga.js
* 
* import different watcher sagas from different saga.js files 
*/
 export default function* root() {
   yield all([
     watchSomething(),
     watchSomething_2(), // the others ...
   ]);
 };

I am not sure abot the way I group the watcher sagas

通常 redux-saga 是异步进程管理器,允许以不同的方式处理订阅和发出事件。
最简单的方式就是使用takeEvery/takeLatest函数,然后sagaprocess manager会自动运行独立进程(正式勾选回调域,因为ES是单-threaded) 每个被困动作。

但您可以通过 fork 效果轻松生成自己的 saga-process,并以自定义方式操作操作。如果许多操作的操作控制流相同,您可以 运行 生成器循环进行后续处理:

function * manyActionsSaga() {
    let flowPromise = Promise.resolve();
    while(true) {
        const action = yield take(['ACTION_1', 'ACTION_2', 'ACTION_3']);
        yield call(() => flowPromise)
        flowPromise = flowPromise.then(() => {
            // Similar event handling
        })
    }
}

当然你也可以对每个动作组一个处理函数,然后bind分别带上目标参数