问题 处理操作时调度进一步的操作


我有一个场景,我觉得我需要发送一个动作来响应另一个动作,我不知道解决它的最佳方法。

调度操作以响应HTTP响应,例如:

type: 'auth'
data: { username: 'tom' }

由于该响应成功,我想发送一个动作将用户发送到主页:

type: 'navigate'
date: { where: 'home' }

这对我来说似乎是一个明智的流程:这件事发生了,所以现在我希望这件事发生。麻烦的是,Flux Dispatcher不允许这样做,因为我们仍在调度周期中。我知道为什么在调度时调度是一个坏主意。

有些人已经通过多个调度员解决了这个问题,而Flux的作者似乎确信你只需要一个,而你需要重新考虑你的商店。

我不知道如何在不模糊意图的情况下重构我的商店以促进这一点。我的 UserStore 知道 auth 行动,我的 RouteStore 知道 navigate 动作。关于如何改变商店以促进这一点的任何建议将不胜感激。

我觉得自己像个 setImmediate 会工作,但似乎有点脏。我还认为排队行动的调度员可能会有所帮助,但我可以感觉到这可能会导致令人讨厌的问题。

最好的方法是什么?


6339
2017-11-14 16:49


起源



答案:


通常,此问题的解决方案是备份并查看原始操作,并等待您尝试在第二个操作中发送的值(如果需要派生值)。

因此,在这种情况下,您只会在UserStore和RouteStore中响应'auth'。


5
2017-11-15 17:26



谢谢回复。让路由存储器响应动作似乎有点奇怪,但我想我还没有正确理解存储的感觉。我认为这是应用程序逻辑进入商店的地方,感觉有点不舒服,但是大多数React / Flux最初感觉倒退,然后最终比“旧方式”好得多! - Tom
我会尝试这个并接受答案,如果它成功了。我可能需要稍微重新调整我的路由器。 - Tom
除了应用程序状态之外,商店应该包含几乎所有的应用程序逻辑。它们是Flux应用程序中所有控件的轨迹。人们可能会在Flux商店之间划出一个平行线,这是一些MVC社区中“胖模型”的理想选择,比如Rails。他们是“胖子”,因为那是所有国家和逻辑生活的地方。 - fisherwebdev


答案:


通常,此问题的解决方案是备份并查看原始操作,并等待您尝试在第二个操作中发送的值(如果需要派生值)。

因此,在这种情况下,您只会在UserStore和RouteStore中响应'auth'。


5
2017-11-15 17:26



谢谢回复。让路由存储器响应动作似乎有点奇怪,但我想我还没有正确理解存储的感觉。我认为这是应用程序逻辑进入商店的地方,感觉有点不舒服,但是大多数React / Flux最初感觉倒退,然后最终比“旧方式”好得多! - Tom
我会尝试这个并接受答案,如果它成功了。我可能需要稍微重新调整我的路由器。 - Tom
除了应用程序状态之外,商店应该包含几乎所有的应用程序逻辑。它们是Flux应用程序中所有控件的轨迹。人们可能会在Flux商店之间划出一个平行线,这是一些MVC社区中“胖模型”的理想选择,比如Rails。他们是“胖子”,因为那是所有国家和逻辑生活的地方。 - fisherwebdev


您应该回顾一下如何创建此流程。

你说你需要创建一个动作来响应另一个动作,对吧? 所以,让我们将其命名为“ActionForwarderStore”。

我们最终得到这样的流程:

AuthAction --> Dispatcher --+--> UserStore
                            |
                            +--> ActionForwarderStore --+
                                                        |
           +--------------------------------------------+
           |
           +-> Dispatcher -----> RouteStore

你看,你仍然有一个人了解这一点 AuthAction 应该最终改变路线?这是 ActionForwarderStore。由于Flux建议每个商店都听取每一个Action,这个知识就是 AuthAction 最终路线变化可以直接进入 RouteStore。喜欢这个:

AuthAction --> Dispatcher --+--> UserStore
                            |
                            +--> RouteStore

请记住,Flux是“创建”的,以避免MVC的不可预测性。如果您保留所有路线更改 RouteStore,您只需要查看此商店代码,以了解哪些操作将导致路由更改。如果您为了响应另一个动作而阻碍创建动作,那么您将只知道这一点 NavigateAction 更改路线,您需要查看其他商店以检查哪些商店正在触发此操作以响应其他商店。

这就是Flux所说的“单向流”。以这种方式捕获问题很容易,因为这是唯一允许的流程。如果单击某个按钮并更改了路径,则可以确定单击调度的操作导致路由更改,没有级联操作。


7
2017-12-19 15:54