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

Ngrx(或一般的Redux)中同步执行动作序列的方法,redux,sequence,action,ngrx,effect,Redux,Sequence,Action,Ngrx,Effect,我正在寻找一种最佳实践或推荐的方法来处理预条件操作,根据条件,在用户发起的操作可以完成副作用之前,必须调度并完成预条件操作(减少副作用) 例如,假设用户启动动作A,但在对A进行REST调用之前,会检查一个条件,并根据该条件,必须首先执行动作B和C(首先执行B的REST调用,然后执行C的REST调用)。只有在B和C rest调用完成后,才执行操作A的rest调用 一种方法是实现一个新的RESTAPI来包含所有这些逻辑。但在这种情况下,这不是一个选择,因为其余的不属于我们 另一个选项是定义动作:A、

我正在寻找一种最佳实践或推荐的方法来处理预条件操作,根据条件,在用户发起的操作可以完成副作用之前,必须调度并完成预条件操作(减少副作用)

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

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

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

  • UI组件分派操作A
  • 州减少了一年
  • 一个函数的效果称为。它检查条件并确定必须执行第一个B&C
  • 效果产生一个动作“BCA”
  • BCA的状态降低
  • 称为BCA的效果。它对B进行其余调用。当它完成时,结果是动作CA
  • 州为CA减少
  • 对CA的影响称为。它对C进行其余调用。当它完成时,结果是动作A'(即A-prime)
  • 状态为“A”减少
  • 称为“A”的效果。它对A进行rest调用。当它完成时,将导致操作D(表示完成)
  • 州为D
  • 起初我觉得这很复杂,但每一个动作都变得相当简单,我喜欢这样。我不喜欢的是行动的爆炸。我有一个用户发起的操作,但需要六个操作来实现它。我们的应用程序将有10个这样的动作,所有这些动作都需要相同的行为,因此我有10X6=60个动作,而不是10+10=20个动作(动作+动作完成)

    因此,我开始思考是否有一种方法可以做到这一点。行动可以包含先决条件和/或后决条件行动,效果可以注意进行rest调用并导致下一个要执行的行动(同样包含先决条件和/或后决条件行动)


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

    以下是我最后做的。。。在执行用户发起的操作之前,有一个操作需要满足任何先决条件。UI组件分派先决条件操作,然后在该操作完成时观察状态更改。然后,它发送用户发起的操作,知道所有先决条件都已处理完毕

    状态有一个属性,指示当前正在执行先决条件。调度“先决条件”操作时,减速机设置此属性;完成所有先决条件后,调度“先决条件完成”操作,减速机重置此属性。这是UI组件观察到的状态

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

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

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

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