为啥 redux-saga 使用 put 方法而不是 dispatch?
Posted
技术标签:
【中文标题】为啥 redux-saga 使用 put 方法而不是 dispatch?【英文标题】:Why does a redux-saga use put method instead of dispatch?为什么 redux-saga 使用 put 方法而不是 dispatch? 【发布时间】:2018-11-03 11:43:41 【问题描述】: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);
...
【问题讨论】:
【参考方案1】:Redux-Sagas 基于generator functions。每当您调用其中之一时,它都会被执行,直到到达 yield
。除了允许您通过等待 Promise 来执行异步操作之外,这在测试方面还有很多优势。
本质上,在您进行测试时,这里试图避免模拟。为此,遵循声明性方法。关键是你不分派(也没有真正做任何事情),中间件会。您只需为该中间件提供名为 Effects 的对象。所以,put 将做的是创建一个中间件将“读取”的 Effect 对象。然后,它将派发动作并使用next(result)
(result
是 Effect 告诉中间件做什么的结果)进入下一个 yield 并获得下一个 Effect强>。你可以阅读更多关于它的信息here。
请记住,与 redux-thunk appear when testing comes in 相比,redux-sagas 的主要优势。 能够仅声明每个 put、call 将返回哪个 Effect... and then just iterating from yield to yield 而不必模拟 API 调用或分派是 redux-sagas 的主要卖点。在你完全理解这个概念之前,你可能需要多阅读和练习一点,但我希望我的解释能解决你的疑问。
【讨论】:
以上是关于为啥 redux-saga 使用 put 方法而不是 dispatch?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 redux-thunk 或 redux-saga 进行 fetches?