Redux-saga:在redux中间件环境之外调用一个传奇

时间:2018-04-16 01:18:58

标签: reactjs redux redux-thunk redux-saga

对于redux传奇很新 - 当我我可以访问商店时,我正试图弄清楚如何在redux中间件环境之外调用一个传奇。

在阅读了redux saga文档后,看起来我有两个选项可以调用store.runSaga或使用redux-saga提供的runSaga实用程序。

这就是我要做的事情:

步骤:

  1. 创建一个暂停的传奇,直到调度成功动作为止。
  2. 这样的事情:

          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});
          }
    
    1. 现在我试图通过store.runSaga https://redux-saga.js.org/docs/api/或runSaga https://redux-saga.js.org/docs/api/index.html#runsagaoptions-saga-args
    2. 来调用传奇

      使用runSaga vs store.runSaga有什么好处吗?我不确定在这一点上我应该使用哪一个。有什么想法/建议?谢谢!

      编辑:关于使用runSaga https://redux-saga.js.org/docs/advanced/UsingRunSaga.html的后续问题 这条线是什么意思

              subscribe: ..., // this will be used to resolve take Effects
      

2 个答案:

答案 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 puttake方法来处理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;
}