对于redux传奇很新 - 当我我可以访问商店时,我正试图弄清楚如何在redux中间件环境之外调用一个传奇。
在阅读了redux saga文档后,看起来我有两个选项可以调用store.runSaga或使用redux-saga提供的runSaga实用程序。
这就是我要做的事情:
步骤:
这样的事情:
export function* loadDashboardSequenced() {
try {
// Take pauses until action received.
//Wait for the user to be loaded
const user_success = yield take('FETCH_USER_SUCCESS');
// ....do other stuff....
} catch(error) {
yield put({type: 'FETCH_FAILED', error: error.message});
}
使用runSaga vs store.runSaga有什么好处吗?我不确定在这一点上我应该使用哪一个。有什么想法/建议?谢谢!
编辑:关于使用runSaga https://redux-saga.js.org/docs/advanced/UsingRunSaga.html的后续问题 这条线是什么意思
subscribe: ..., // this will be used to resolve take Effects
答案 0 :(得分:1)
store.runSaga
方法用于启动商店的根传奇。它还期望redux-saga成为商店中间件:
export default function configureStore(initialState) {
const sagaMiddleware = createSagaMiddleware()
return {
...createStore(reducer, initialState, applyMiddleware(/* other middleware, */sagaMiddleware)),
runSaga: sagaMiddleware.run
}
}
const store = configureStore()
store.runSaga(rootSaga)
另一方面,runSaga
方法用于将redux-saga连接到非存储对象和接口,这是你很少做的事情。
总之,如果您需要使用sagas put
和take
方法来处理redux操作,那么您需要使用redux-saga作为商店中间件。
答案 1 :(得分:0)
如果您有一个从REST API检索数据然后将数据传递给reducer的传奇...那么在没有存储的情况下测试您的传奇很有意义。
此外,我对Beginner Tutorial测试不满意的是,我想测试整个堆栈,从客户端到服务器。 “入门教程”中的测试无法进行测试,因为它们实际上并没有获得传奇的执行结果,仅是call/put
消息。
我会在The best way to test Redux Sagas中进行全面讨论,但这是一个快速示例,总结了Phil Herbert的帖子:
import { runSaga } from 'redux-saga'; // using runSaga to execute the saga
import { testMeSaga } from './sagas'; // the saga under test
test('test testMeSaga by running it', async () => {
// 'recordSaga' is a utility function for running sagas, see it below.
const result = await recordSaga(
testMeSaga,
{ payload: 'your input to the saga' }
);
expect(result.length).toBe(1);
// add more checks here ...
});
// this is the utility function that wraps the running of the saga
async function recordSaga(saga, initialAction) {
const dispatched = [];
await runSaga(
{
dispatch: (action) => dispatched.push(action)
},
saga,
initialAction
).done;
return dispatched;
}