【问题标题】:Sequential actions in FluxFlux 中的顺序操作
【发布时间】:2015-09-11 00:37:51
【问题描述】:

每隔一段时间,我都会遇到需要连续执行多个操作的情况。使用 Facebook 的 Flux 实现,这样做会导致抛出错误:“无法在调度过程中调度”。显然这个错误是有原因的,所以我想知道如何以不同的方式构建我的应用程序。

这是一个可能发生这种情况的示例场景:

  1. 用户尝试登录,但提供了错误的凭据
  2. 触发了名为failedToAuth 的操作
  3. 名为ErrorHandler 的服务正在侦听failedToAuth 操作
  4. 根据错误,ErrorHandler 可能会将用户重定向到另一个页面或创建错误通知

在第 4 种情况下,可能会触发另一个动作。为了 例如,它可能是 redirectToPage 操作或 createError 行动。不幸的是,如果没有 抛出上述错误。

另一个例子:

  1. 应用程序首次加载时,需要检索一些状态数据。
  2. 它向服务器执行请求,并在检索结果时触发 3-4 个动作,每个动作都有一些用于检索的参数 数据。
  3. 多个商店可能正在监听这些操作,这些操作具有自己的域逻辑来处理检索到的数据。

再次抛出调度错误。我可以创建一个大型元动作 称为serverResponse,它拥有所有数据,因此只需一个动作 而不是很多。但是,这似乎是tight coupling 的情况, 这将是另一个恶习。

那么解决需要触发顺序操作的情况的正确方法是什么?

注意:我知道我可以使用 setTimeout,但这样做只是为了解决因某种原因而存在的错误。

【问题讨论】:

    标签: javascript flux


    【解决方案1】:

    我认为这里的问题是您将更新 RouteStore 状态的责任放在 ErrorHandlerStore 中,这不是正确的位置。如果商店的状态受到动作的影响,它应该知道该动作,而不是将该知识转移到其他地方。因此,相反,如果您有路由存储,请让其监听 failedToAuth 操作并针对适用情况相应地更新路由。如果你想把逻辑来决定ErrorHandlerStore中的路由更改,你必须让RouteStore等待那个存储(使用waitFor)并从ErrorStore中读取它需要的信息,但这不一定是最好的大大地;可能 ErrorStore 应该负责错误消息状态,但它并不真正负责路由。您可以有一个单独的 ErrorHandler 模块来集中错误处理逻辑,并让两个存储(例如 Route 和 ErrorMessage)调用它来决定如何更新它们的状态 - 根据您的需要有很多选项。

    在第二种情况下,如果触发多个动作是有意义的,因为分段处理它更容易,而且不需要全部查看,这不一定是问题 - 您可以一个接一个地顺序调度动作而不会出现任何问题,因为每个都将被同步处理,所以每个调度将在下一次开始之前完成。如果你使用 React,唯一的事情就是你需要将它们批量化,以避免多次 React 渲染(即使你只触发一个动作也是这种情况,因为单个动作最终可能会触发多个组件的 setState 调用) .您需要在 Flux 中使用某种帮助程序来允许批量调用多个操作,这也将调用 React.addons.batchedUpdates 以确保所有 setState 调用都是批处理的(实际上,您应该在处理 ajax 响应时始终使用 batchedUpdates,因为否则你可能会渲染多次)。

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多