gpt4 book ai didi

javascript - Flux 中的顺序操作

转载 作者:行者123 更新时间:2023-11-29 21:46:27 25 4
gpt4 key购买 nike

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

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

  1. A user tries to log-in, but provides the wrong credentials
  2. An action is fired called failedToAuth
  3. A service called ErrorHandler is listening for failedToAuth action
  4. Depending on the error, ErrorHandler may redirect the user to another page or create an error notification

In the case of the 4th situation, another action may be fired. For example, it might be a redirectToPage action or a createError action. Unfortunately, these cannot be fired without the aforementioned error thrown.

另一个例子:

  1. When the application first loads, it needs to retrieve some state data.
  2. It performs a request to the server and upon retrieving the result, it fires 3-4 actions that each have some parameters for the retrieved data.
  3. Several stores may be listening to these actions which have their own domain logic to handle the data retrieved.

Again, the dispatch error is thrown. I could create a big meta action called serverResponse that has all the data so its in one action rather than many. However, this seems like a case of tight coupling, which would be another vice.

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

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

最佳答案

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

在第二种情况下,如果触发多个 Action 是有意义的,因为分段处理它更容易,而且不需要看到所有的东西,那不一定是个问题——你可以一个接一个地按顺序分派(dispatch) Action ,没有任何问题,因为每个都将被同步处理,所以每个分派(dispatch)都会在下一个开始之前完成。如果你正在使用 React,唯一的事情就是你需要将它们分批处理,以避免多次 React 渲染(如果你只触发一个 Action ,甚至是这种情况,因为一个 Action 最终可能会触发多个组件 setState 调用) .你需要在你的 flux 中使用某种帮助器来允许批量调用多个 Action ,它也会调用 React.addons.batchedUpdates 来确保所有 setState 调用都是批处理的(事实上,在处理 ajax 响应时你应该总是使用 batchedUpdates,因为否则你最终可能会渲染多次)。

关于javascript - Flux 中的顺序操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31032836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com