Redux saga,rx-observable。使用 vanilla fetch 调用,为什么需要 thunk?

Redux saga, rx-observable. With vanilla fetch calls, why the need over thunks?

我一直在阅读传奇、它们的意图和用法。但是 - 我有两个问题我真的很想结束,然后是更多的意见问题。

  1. 当使用 Sagas 进行简单的 api 调用时,样板文件似乎非常多。如果我有 20 个 api 调用,这比使用 thunk 更容易使用吗?另外,我一直听到 "side effects" 的想法 - 但我不确定它是如何发挥作用的。

我读过一些博客,这些博客使用了一种能够动态生成 Sagas 以减少样板文件的模式 - 但你不能用 thunk 来做到这一点吗?另外,任何例子都会很棒。

  1. 在处理非常简单的 post 或接到电话时,Sagas 是否仍然有用?

对 redux-sags 和 redux-observables 有什么看法吗?

谢谢!

免责声明:我是 redux-observable 的作者之一,所以我对 redux-saga 和 redux-observable 的看法都带有偏见

由于您使用了 Saga(而不是 Epic)这个词,我假设您是在 redux-saga(不是 redux-observable)的背景下提问的。

在 redux-saga 中,你做的效果,例如AJAX 请求实际上并没有直接在生成器传奇中处理。相反,您使用的助手正在创建普通旧 JavaScript 对象,这些对象 代表 效果 intent,您 yield 和然后 redux-saga 中间件本身在内部执行效果,对你隐藏,将结果提供给你的收益,比如 yourSaga.next(response).

有些人喜欢这样,因为您的 saga 生成器非常纯粹。因为它使用生成器来支持多种效果,所以无需模拟就可以轻松进行测试,因为您只需断言它产生的效果是预期的。就我个人而言,我发现在实践中这似乎比实际情况要酷得多:很多时候你最终会有效地重新创建 saga 在你的测试中所做的一切。您现在正在测试 saga 的 implementation 是正确的,而不是测试 saga 的 behavior。许多人不在乎(甚至注意到这一点),但我做到了。我想有些人甚至更喜欢它。这叫做"effects as data"。 FWIW,redux-observable 没有使用这种 "effects as data" 模型,这是它与 redux-saga 最根本的区别。

将这与它们与 redux-thunk 的比较联系起来,最大的区别是:基于时间的操作(例如,去抖动顺序操作)单独使用 redux-thunk 没有重大黑客攻击是不切实际的。说到去抖动,它根本没有任何实用程序,因此您只能处理去抖动和其他常见效果。测试要难得多。

然而,这些主要是意见。当然,非常成功的应用程序可以(并且已经)使用 redux-thunk。 https://m.twitter.com 想到了。

我认为说 redux-thunk 对于简单的请求-> 响应 AJAX 调用来说更容易学习和使用,不需要取消等,我认为这不会引起争议。事实上,我经常建议不熟悉 RxJS 的用户使用 redux-thunk 来处理简单的事情,而只依靠 redux-observable 来处理更复杂的事情,这样他们就可以保持高效并边学边做。学术 "correctness" 和漂亮的代码肯定有一席之地,但对于大多数人的工作来说,shipit™ 应该是第一要务。用户不关心我们的代码有多正确,只关心它存在并且 [大部分] 有效。


关于 redux-saga 与 redux-observable 的观点,我有偏见,因为我是 redux-observable 的作者之一,但我在之前的 SO 中总结了一些想法 post : tl;dr 它们具有相似的整体模式,但 redux-saga 使用 "effects as data" 而 redux-observable 使用 RxJS 的真实效果。两者都有利有弊,使用 RxJS 的主要优点是它是一种技能,除了 redux-observable 之外,它是一项非常有用的技能,并且几乎肯定会比 redux-observable/redux-saga 更长久,因此该技能具有高度可移植性。