gpt4 book ai didi

angular - RxJs:防止无限循环

转载 作者:行者123 更新时间:2023-12-02 03:55:30 26 4
gpt4 key购买 nike

考虑以下场景:

observerX => observableA <= observerY => observableB <= observerZ
  • 有两个可观察量(AB)和三个观察者(X) YZ)。
  • 这些观察者和可观察对象中的每一个都位于单独的(Angular)服务中。
  • 观察者Y观察Observable A和Observable B,它们在应用程序的生命周期中保持“事件”,即它们不完成。
  • 当 Observable A 触发事件时,观察者 Y 会调用 Observable B 服务上的函数,从而导致 Observable B 触发事件。类似地,当 Observable B 触发事件时,观察者 Y 会调用 Observable A 服务上的函数,进而导致 Observable A触发事件。

例如:观察者 Y...

svcA.obsA.subscribe(()=> {
svcB.doSomething()
});

svcB.obsB.subscribe(()=> {
svcA.doSomething()
});

如您所见,观察者 Y 所做的就是保持服务 A 和服务 B 同步。

问题:上述设置会导致无限执行循环。为了解决这个问题,我想到的一个想法是在每个订阅中设置一个标志,当设置该标志时,另一个订阅将忽略下一个事件。然而,这不是一个正确的解决方案,因为下一个事件可能不一定是与观察者 Y 调用 doSomething() 相对应的事件,但可能是由于观察者 XZ 调用 doSomething()

这个用例有一个优雅的解决方案吗?我这里有架构问题吗?如果我对问题的描述不清楚,请告诉我。

JSFiddles:

最佳答案

好的,所以可以使用以下自动机对这种关系进行建模(ObserverY 仅转发,因此可以忽略):

enter image description here

它将永远循环。问题是您无法仅使用一个 channel 来避免无限循环(即不检查消息是否来自外部或邻居 (A/B))。

所以,你的选择:

  1. 将对象耦合在一起,以便它们可以区分消息(A/B 可以判断消息是否来自 B/A)。

  2. 使用单独的 channel 来传递信息(据我所知,您不能通过 Rx 实现这一点,但我可能是错的)。

  3. 使用这个技巧:https://jsfiddle.net/6oz6mgLL/ ,它添加了单独的方法 sync() 和 bool synced。对象不耦合,但每个外部事件都会花费您 1 次重复的方法调用(研究代码以了解原因)。

  4. 这与您的问题描述不符,但如果使用仅包含一项并仅在其更改时进行广播的 ReplaySubject,则 3. 中的解决方案将顺利工作,无需额外调用。我不知道您是否可以应用 ReplaySubject

如果对象在概念层面上耦合,那么在代码中保持解耦可能并不总是可能的。

希望这至少有一点帮助。

关于angular - RxJs:防止无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44058150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com