Javascript 如果两个通量存储必须相互依赖,该怎么办

Javascript 如果两个通量存储必须相互依赖,该怎么办,javascript,flux,Javascript,Flux,Flux的目标之一是通过减少疯狂纠结的依赖关系,使应用程序更加可预测。使用Dispatcher,您可以定义存储更新的严格顺序。这创建了一个很好的树依赖层次结构。这就是理论。考虑以下情况: 我有一个游戏。位于层次结构顶部的存储是状态存储,它只保存当前游戏状态,即。E演奏,暂停,结束。它通过暂停或恢复等操作更新。所有其他商店都依赖这家。因此,当一个商店处理某种更新操作(即向左移动)时,它首先检查StateStore,如果游戏暂停或结束,它会忽略该操作 现在让我们假设有一个动作会导致游戏结束。它更新了

Flux的目标之一是通过减少疯狂纠结的依赖关系,使应用程序更加可预测。使用Dispatcher,您可以定义存储更新的严格顺序。这创建了一个很好的树依赖层次结构。这就是理论。考虑以下情况:

我有一个游戏。位于层次结构顶部的存储是状态存储,它只保存当前游戏状态,即。E演奏,暂停,结束。它通过暂停或恢复等操作更新。所有其他商店都依赖这家。因此,当一个商店处理某种更新操作(即向左移动)时,它首先检查StateStore,如果游戏暂停或结束,它会忽略该操作

现在让我们假设有一个动作会导致游戏结束。它更新了一些商店,商店决定游戏不应该继续(“游戏角色向左移动并落入陷阱”)。因此,StateStore中的状态应更改为over。我该怎么做

理论上,应该是这样的:

  • 给定的存储首先更新并到达游戏结束点
  • StateStore随后更新(它等待另一个存储),检查另一个存储并将状态切换到over
  • 不幸的是,另一个存储也需要访问StateStore来检查当前的游戏状态,看看它是否应该更新(即游戏没有暂停)。他们显然相互依赖

    可能的解决办法:

  • 将这些存储合并到一个存储中。这可能会导致我的整个应用程序崩溃成一个单一的商店,这就提出了一个问题,在这种情况下,Flux是否是一个好主意
  • 区分更新顺序和只读依赖项。所有的商店都会按照严格的顺序进行更新,但是它们可以任意读取彼此的信息。因此,StateStore将针对每个操作检查所有现有存储,如果其中任何一个指示游戏结束,它将将状态更改为结束,从而有效地防止所有其他存储更新
  • 你认为呢?

    商店应该尽可能相互独立,不应该互相阅读。改变他们状态的唯一方法是通过行动


    在您的情况下,如果某个商店决定游戏结束,您应该从ActionCreator更新StateStore。您可以通过从商店中调用HaltGameActionCreator或从ActionCreator中发送一个暂停游戏动作来完成此操作,该动作首先触发了商店的更改。

    对于那些有相同问题的人,您可以了解我遇到此问题的实际应用程序以及我是如何处理此问题的。长话短说,我允许所有商店任意读取彼此的信息(建议的解决方案2)

    请注意,ES6模块允许循环依赖,从而简化了实现

    然而,回顾过去,我不确定这是否是一个正确的决定。如果一个业务逻辑内在地包含一个循环依赖项,我们不应该仅仅因为有人这么说就尝试应用一个不真正支持它的解决方案。通量只是一种模式,还有许多其他方法可以用来构造代码。因此,也许我会建议将整个逻辑分解为一个存储,并使用其他方法之一来实现存储本身(例如,标准OOP技术)

    <>我也会考虑使用,而不是助焊剂。原始示例的问题在于StateStore依赖于两个不同的输入。可以通过用户明确暂停/恢复游戏或通过游戏结束时的游戏情况进行更改。这种方法的优点是,您只需检查一个商店即可获得当前游戏状态

    使用redux/reselect,一个减速机处理暂停/恢复操作,另一个减速机处理游戏情况。然后你会有一个选择器,将这两条信息组合成最终的游戏状态。大多数业务逻辑将从商店移动到动作创建者,即在
    moveLeft()
    action creator中,您将使用此选择器检查游戏状态,然后才分派
    MOVE\u LEFT
    动作


    请注意,这只是一个粗略的想法,我不知道它是否可行。

    阅读和改变是两件不同的事情。在我的示例中,我不需要从一个商店更改另一个商店,我需要从另一个商店阅读。此外,不允许在处理前一个操作时调度新操作,并且通过异步调度该操作来解决这一问题,这似乎有点不切实际。我可以检查商店的游戏后,派遣移动_左在创造者,因此派遣停止_游戏,如果需要,但似乎也不正确。如果向左移动导致游戏结束,则应用程序状态(StateStore)应包含该信息,我不需要其他操作。@opportunato“存储应尽可能相互独立”:但是
    Dispatcher
    有一个
    waitFor
    方法,这在所有facebook示例中都很少使用。你能想出一个解决方法吗?我现在也遇到了同样的问题。我添加了一个可能对你有帮助的答案。有趣的是,你会允许商店触发发货吗?也就是说,要运行操作的存储。这里的含义是商店可以互相发送动作……不,我写道。他们可以互相阅读。商店无法分派操作,默认的Facebook Flux实现甚至不允许它。您可以通过在action creator内部分派一系列操作来绕过此限制,但在本例中,这也不是一个好的解决方案。如果一个特定的用户交互导致游戏结束,则不需要两个操作来更新状态。