Flux中的顺序动作

时间:2015-06-24 17:09:28

标签: javascript flux

每隔一段时间,我就会遇到需要连续发起多个动作的情况。随着Facebook对Flux的实施,这样做会导致错误抛出:"无法在发送过程中发送。"显然这个错误有一些原因,所以我想知道如何以不同的方式构建我的应用程序。

以下是可能出现这种情况的示例方案:

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

    在第四种情况下,可能会触发另一项行动。对于   例如,它可能是redirectToPage操作或createError   行动。不幸的是,没有这些就无法解雇   上述错误抛出。

另一个例子:

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

    同样,抛出了调度错误。我可以创建一个大的元动作   名为serverResponse,其中包含所有数据,因此只需一次操作即可   而不是很多。但是,这似乎是tight coupling的情况,   这将是另一个恶习。

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

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

1 个答案:

答案 0 :(得分:2)

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

在第二种情况下,如果触发多个动作是有意义的,因为它更容易分段处理,没有什么需要全部查看,这不一定是个问题 - 你可以派遣操作顺序逐个没有任何问题,因为每个都将同步处理,因此每个调度将在下一次启动之前完成。如果您正在使用React,那么您唯一需要对其进行批处理,以避免多次React渲染(如果您只触发单个操作,则情况就是如此,因为单个操作可能最终会触发多个组件setState调用)。你需要某种助手才能允许批量调用多个动作,这也会调用React.addons.batchedUpdates来确保所有的setState调用都是批处理的(事实上,在处理ajax响应时你应该总是使用batchedUpdates) ,否则你最终可以多次渲染。)