什么是Redux传奇的更好的结构

时间:2017-11-23 02:05:08

标签: javascript reactjs redux redux-saga saga

我已经考虑了传奇的结构并且采用了一种方法,但不知道它是否正确。

例如,我有多个saga文件,对于每个典型的saga文件,有一个观察者传奇“同时”观看不同的动作,然后我们只需要导出这个观察者传奇默认。

这是我的尝试性方法:

我不确定我对观察者传奇的分组方式

/**
* 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 ...
   ]);
 };

1 个答案:

答案 0 :(得分:0)

  

我不确定我对守望者传奇的分组方式

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

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

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