清除行为排队事件的主题,每个在Obularable中使用Observables进行处理

时间:2017-05-16 18:52:24

标签: javascript angularjs events rxjs angular2-observables

我遇到的问题我确信完全基于我(缺乏)对Observables的完整理解。

这是一个使用rx / js和Observables的Angular2(v4.0.3)项目。

我有一个状态存储,用于保存状态服务中的事件:

  // Observable string sources
  private currentEventStore = new BehaviorSubject<string>("");

  // Observable string streams
  public currentEvent$ = this.currentEventStore.asObservable();

  // Service message commands
  setCurrentEvent(nextEvent: string) {
    this.currentEventStore.next(nextEvent);
  }

我在我的组件中订阅了currentEvent $来监听事件,然后对它们采取行动。

this.stateSvc.currentEvent$
  .subscribe(
  currentEvent => {
    this.currentEvent = currentEvent;
    if (currentEvent != '') {
      this.handleCurrentEvent(currentEvent);
    }
  });

我遇到的问题是商店正在累积所有事件并且每次都返回所有事件,因此当我生成'create'事件时,我订阅的函数会选择事件并创建记录 - 完美的第一次传递,但是如果我产生第二个'create'事件,我订阅的函数会获取2个事件,并创建2个记录,而在下一个'create'事件中它会创建3个记录,依此类推。

我需要做的是将事件从流中刷新,以便currentEvent $ store仅保存尚未解决的事件。

有没有办法冲洗商店?或者我的期望和实施中是否有一些我缺少的东西?

1 个答案:

答案 0 :(得分:1)

通常情况下,在对问题进行了几天的攻击之后,在发布问题的几个小时内我就找到了答案。

这里的问题是,每当我重新访问注册订阅者的组件时,它会向观察者添加一个新订阅者,以便在第二次访问时,有两个订阅者,每个订阅者都会触发,从而导致事件被处理两次。第三次回来,现在有三个订阅者,所以事件被处理了三次。

我需要做的是修改我的订阅以便将它们分配给变量,然后在销毁组件时取消订阅。

所以订阅应该是这样的(请注意添加&#39; this.observeEvent =&#39;

else

我将其添加到组件中:

this.observeEvent = this.stateSvc.currentEvent$
  .subscribe(
  currentEvent => {
    this.currentEvent = currentEvent;
    if (currentEvent != '') {
      this.handleCurrentEvent(currentEvent);
    }
  });

未注册订阅者,因此每次加载此组件时他们都不会累积。

我曾试图弄清楚如何更早地完成这项工作,但是如果没有将Observable分配给实例变量,我就无法在ngOnDestroy方法中找到任何有效的取消订阅语法。