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

Why does a redux-saga use put method instead of dispatch?

README 文件中的演示示例使用了一个名为 put() 的函数,而不是 worker saga 中的 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});
   }
}

...

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

从本质上讲,模拟是您在测试时要尽量避免的。为此,遵循声明式方法。关键是 你不分派(也没有真正做任何事情),中间件。您只需为该中间件提供名为 Effects 的对象。因此,put 将做的是 创建中间件将“读取”的 Effect 对象。然后,它将分派操作并使用 next(result)result 是 Effect 告诉中间件执行的任何操作的结果) 转到下一个 yield得到下一个Effect。您可以阅读更多相关信息 here

请记住,与 redux-thunk 相比,redux-sagas 的主要优势是 appear when testing comes in. Being able to just declare which Effect will be returned by each put, call... and then just iterating from yield to yield 而不是模拟 API 调用或调度是 redux-sagas 的主要卖点。在你完全理解这个概念之前,你可能需要多阅读和练习一点,但我希望我的解释能解决你的疑问。