Ngrx或一般的 Redux中同步执行动作序列的方法

如何解决Ngrx或一般的 Redux中同步执行动作序列的方法

我正在寻找处理前置条件操作的最佳实践或推荐方法,其中,基于条件,前置操作必须在用户启动的操作完成之前分派并完成(减少和副作用)副作用。

例如,假设用户启动了操作 A,但在对 A 进行 REST 调用之前,会检查一个条件,并且必须根据该条件首先执行操作 B 和 C(首先是 B 的休息调用,然后是 C 的休息调用)。只有在 B 和 C 休息调用完成后,才执行动作 A 的休息调用

一种方法是实现一个新的 REST API 来包含所有这些逻辑。但在这种情况下,这不是一种选择,因为 REST 不归我们所有。

一个选项是定义动作:A、BCA、CA、C、A'(即 a-prime)和 D(表示完成)。顺序是:

  1. UI 组件调度操作 A。
  2. A 的状态减少了。
  3. A 的效果调用。它检查条件并确定必须执行第一个 B&C。
  4. 效果导致一个动作“BCA”。
  5. 状态为 BCA 减少。
  6. BCA 的效果调用。它为 B 发出其余的调用。当它完成时,导致动作 CA。
  7. CA 的状态减少了。
  8. 调用 CA 的效果。它为 C 发出其余的调用。当它完成时,会产生动作 A'(即 A-prime)。
  9. A' 的状态减少。
  10. 调用 A' 的效果。它为 A 发出其余的调用。当它完成时,会产生操作 D(完成)。
  11. D 的状态减少了。

起初对我来说这似乎很复杂,但每个动作都变得相当简单,我喜欢这样。我不喜欢的是动作的爆炸性。我有一个用户启动的操作,但需要六个操作来实现它。我们的应用将有 10 个这样的操作,它们都需要相同的行为,因此我有 10X6=60 个操作,而不是 10+10=20 个操作(action + action_done)。

因此,我开始考虑是否有一种通用的方法可以做到这一点。操作可以包含先决条件和/或后置条件操作,并且效果可以负责调用其余的操作并导致要执行的下一个操作(再次包含先决条件和/或后置条件操作)。

这似乎是一个常见的用例,所以我也想知道 Ngrx 是否有一些内置的同步动作序列机制,其中一个效果必须在分派下一个动作之前完成。

解决方法

这是我最终要做的事情...在执行用户启动的操作之前,有一个操作可以满足任何先决条件。 UI 组件调度先决条件操作,然后在该操作完成时观察状态更改。然后它会在知道所有先决条件都已满足的情况下分派用户启动的操作。

状态具有指示当前正在执行先决条件的属性。当“先决条件”操作被分派时,reducer 会设置此属性,当所有先决条件都完成后,“先决条件”操作会被分派,并且reducer 会重置此属性。这是 UI 组件观察到的状态。

有许多先决条件(三个休息调用),从零到所有三个都需要按顺序执行,具体取决于应用程序的状态。每次休息调用也会导致应用程序的状态发生较大变化。一个路由到一个带有新查询参数的 URL。最好将这三个 rest 调用作为三个单独的“doit”和“done”动作处理,以便为每个动作分别减少状态。

每个“doit”动作的效果执行其余调用并分派“完成”动作(以及包含状态负载的另一个动作)。每个“完成”动作的效果重新分配“先决条件”动作,其中效果重新评估条件并分配下一个“doit”动作。如果满足所有先决条件,则效果会发送“先决条件-完成”操作。

我喜欢这种方法,因为可以单独为每个休息调用减少状态,而不是尝试进行所有三个休息调用并收集巨型状态,然后进行“大爆炸”减少。我也喜欢这种方法,因为它限制了所有 UI 组件的复杂性,这些组件需要确保在每个操作之前检查/执行相同的先决条件集。

我对如何将每个“doit”和“done”动作重新绑定到“先决条件”动作(通过效果)以执行下一个“doit”动作并不特别满意,因为感觉有点复杂和复杂做一些本质上是一个非常简单的 if-then-else 逻辑的事情来进行零到三个休息调用。但考虑到它避免了“大爆炸”减速器并允许重复使用,这似乎是一个相当公平的权衡。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?