为啥 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?

多个 redux-sagas

redux-saga

redux-saga基本用法

如何在路由中定义 PUT 方法仅限制为控制器中的 Put 方法而不使用参数?

MailChimp:为啥带有 javascript 的 PUT 方法返回“使用 PUT 插入或更新列表成员”