为什么redux-saga使用put方法而不是dispatch?

时间:2018-05-24 09:44:32

标签: javascript reactjs react-redux redux-saga

README文件中的演示示例在工作者传奇中使用了一个名为put()而不是dispatch()的函数。

...

// worker Saga: will be fired on USER_FETCH_REQUESTED actions
function* fetchUser(action) {
   try {
      const user = yield call(Api.fetchUser, action.payload.userId);
      yield put({type: "USER_FETCH_SUCCEEDED", user: user});
   } catch (e) {
      yield put({type: "USER_FETCH_FAILED", message: e.message});
   }
}

...

1 个答案:

答案 0 :(得分:7)

Redux-Sagas基于generator functions。每当您调用其中一个时,它就会被执行,直到达到 yield 。除了允许您通过等待承诺执行异步操作之外,这在例如测试方面具有许多优点。

从根本上说,模拟是你在测试时试图避免的。为此,遵循声明式方法。关键是你不发送(也没有真正做任何事情),中间件确实。您只为此中间件提供名为效果的对象。那么, put 将会做什么来创建一个中间件将会"读取"的效果对象。然后,它将调度操作并使用next(result) result是效果告诉中间件要做的任何结果)转到下一个产量并获得下一个效果。您可以阅读更多相关信息here

请记住,与redux-thunk appear when testing comes in相比,redux-sagas的主要优点。 只需声明每个put会返回哪个效果,调用... and then just iterating from yield to yield而不是模拟API调用或调度是redux-sagas的主要卖点。在完全理解这个概念之前,您可能需要阅读和练习一点,但我希望我的解释能够解决您的疑问。