【问题标题】:Redux saga, rx-observable. With vanilla fetch calls, why the need over thunks?Redux 传奇,rx-observable。使用 vanilla fetch 调用,为什么需要超过 thunk?
【发布时间】:2017-05-02 17:09:14
【问题描述】:

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

  1. 使用 Sagas 进行简单的 api 调用时,样板文件似乎非常多。如果我有 20 个 api 调用,那怎么比使用 thunk 少?另外,我一直听到“副作用”的想法——但我不确定它是如何发挥作用的。

我阅读了一些博客,它们使用了一种能够动态生成 Sagas 以减少样板代码的模式 - 但您不能也使用 thunk 来做到这一点吗?此外,任何示例都会很棒。

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

对 redux-sags 与 redux-observables 有何看法?

谢谢!

【问题讨论】:

    标签: redux redux-saga redux-observable


    【解决方案1】:

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

    由于您使用术语 Saga(而不是 Epic),我假设您是在 redux-saga(不是 redux-observable)的上下文中询问的。

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

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

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

    但是,这些主要是意见。当然,非常成功的应用程序可以(并且已经)使用 redux-thunk。 https://m.twitter.com 浮现在脑海中。

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


    关于 redux-saga 与 redux-observable 的观点,我是有偏见的,因为我是 redux-observable 的作者之一,但我在之前的 SO 帖子中总结了一些想法:Why use Redux-Observable over Redux-Saga? tl; dr 他们有类似的整体模式,但 redux-saga 使用“效果作为数据”,而 redux-observable 使用 RxJS 的真实效果。两者的优点和缺点,使用 RxJS 的主要优点是它是一种技能,对于 redux-observable 以外的东西来说是一项非常有用的技能,并且几乎肯定会比 redux-observable/redux-saga 寿命更长,因此该技能是高度可转移的。

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2018-07-08
      • 2018-04-12
      • 2021-11-25
      • 1970-01-01
      • 2017-04-26
      相关资源
      最近更新 更多