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

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


  
  用户尝试登录,但提供了错误的凭据
  触发一个名为failedToAuth的动作
  名为ErrorHandler的服务正在监听failedToAuth动作
  根据错误,ErrorHandler可能会将用户重定向到另一个页面或创建错误通知
  
  
  在第四种情况下,可能会采取其他措施。对于
  例如,它可能是redirectToPage操作或createError
  行动。不幸的是,如果没有
  前面提到的错误。


另一个例子:


  
  当应用程序首次加载时,它需要检索一些状态数据。
  它执行对服务器的请求,并在检索结果后触发3-4个操作,每个操作都有一些用于检索的参数
  数据。
  几个商店可能正在监听这些操作,这些操作具有自己的域逻辑来处理检索到的数据。
  
  
  同样,将抛出调度错误。我可以创建一个大型元操作
  被称为serverResponse拥有所有数据,因此只需一次操作
  而不是很多。但是,这似乎是tight coupling的情况,
  这将是另一种恶习。


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

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

最佳答案

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

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

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

10-12 19:16