为啥我们需要 Flux 中的调度程序?

Posted

技术标签:

【中文标题】为啥我们需要 Flux 中的调度程序?【英文标题】:Why do we need dispatcher in Flux?为什么我们需要 Flux 中的调度程序? 【发布时间】:2017-01-28 01:02:50 【问题描述】:

这不是 React 特定的问题。我正在考虑在 Aurelia/Angularjs 中实现 Flux。

在阅读通量时,我不相信调度程序步骤的必要性。为什么组件不能直接调用 store 来更新和检索数据?这种方法有什么问题吗?

例如:如果我有一个CarStore 可以创建新车、更新汽车并获取汽车列表(只是 CRUD api 上的一个薄层),我应该能够直接检索/更新列表从car-grid 组件调用商店。由于 store 是一个单例,每当列表更新时,car-grid 应该会自动获取新项目。在这种情况下使用调度程序有什么好处?

【问题讨论】:

【参考方案1】:

我使用 React-native 和 Redux 作为存储/视图状态更新器创建了几个大型应用程序。

无论如何,调度操作都是同步的。使用调度程序有一个很大的缺点,您会丢失函数签名。 (调试、自动捕捉类型错误、重构丢失、同一函数的多个声明,不胜枚举)

永远不必使用调度程序,它不会引起任何问题。在操作中,我们只需调用 getState().dispatch。无论如何,这家商店是单身人士,强烈建议您不要拥有多家商店。 (你为什么要这么做……)

【讨论】:

【参考方案2】:

您可以看到here 为什么调度员很重要(查看为什么我们需要调度员部分)。在我看来,这个想法基本上是能够以同步方式访问各种存储(一个回调在调用另一个回调之前完成)。这要归功于waitFor 方法,它允许您等待商店完成处理操作(或更多棕褐色)。有一个很好的例子in the docs。例如,您的应用程序可能会增长,而不是只有那个 CarStore,您还有另一个 Store,其更新依赖于 CarStore 更新。

【讨论】:

为什么不能在组件中管理该依赖关系?例如,如果您想更新多个相互依赖的商店,您可以使用 Promise。 例如,当汽车被添加到CartStore 时,我们需要从WishlistStore 中删除它。从您的组件中,您可以将汽车添加到 CartStore,它返回一个承诺,当它成功时您更新 WishlistStore 我猜你可以这样做,但是 Flux 为你提供了调度程序和功能,作为一种工具,使它更容易。在极端情况下,您可以使用纯 javascript 完成所有操作,框架只是为您提供一些工具和模式,使其更容易和/或更好地组织。 我明白了。我只是对以这种方式组织程序的基本原理感到好奇。 在我看来,调度程序具有所有那种逻辑,并不是每个 Flux 用户都在组件上按照他的意愿进行操作。这是一种常见的情况,使用相同的方法解决它通常会有所帮助。【参考方案3】:

如果您只拥有一家商店,那么我认为调度员是多余的。但是,如果您有多个商店,那么调度程序很重要,这样操作就不需要了解每个商店。

请注意,如果您只有一家商店,我并不是说您应该放弃调度员。这仍然是一个很好的模式,因为如果您将来需要,它可以让您选择支持多个商店。

【讨论】:

以上是关于为啥我们需要 Flux 中的调度程序?的主要内容,如果未能解决你的问题,请参考以下文章

在 Flux 应用程序中跟踪 ajax 请求状态

谁负责从带有缓存的 Flux 应用程序中的服务器获取数据?

React Native + Flux,无响应的调度程序

Flux Utils 存储和异步定时器

如何通过 Flux 使用不同的调度程序运行两个任务

React Flux:存储依赖项