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});
}
}
...
答案 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的主要卖点。在完全理解这个概念之前,您可能需要阅读和练习一点,但我希望我的解释能够解决您的疑问。