更新behaviorsubject中的特殊元素,或仅订阅一次

时间:2019-04-12 00:14:51

标签: javascript angular rxjs behaviorsubject

我的BehaviorSubject正在从我的其他文件中每5秒继续更新。

但是,某些主题我无法等待5秒才能发生新事件,所以我正在寻找一种仅更新Behaviorsubject的单个元素的方法。

我创建了以下内容来处理单个元素:

 updateSingleTimer(timer,time,secs = false) {
    this.timers$.pipe(takeUntil(this._destroyed$)).subscribe((data:any) => {
      var newdata = data;
      newdata[timer] = time;
      this.updateTimers(newdata);
    });
  }

当然,这将创建一个无限循环,因为一旦updateTimers函数被调用,计时器就会更新。

因此,我只需要在updateSingleTimer函数中获取一次计时器数据,而不需要订阅它。

问:我将如何更改上面的代码,使其仅从this.timers$获得一次结果?

Q:而且,是否有可能比即时通讯当前更简便的方式更新单个元素?

完整代码:

  _timers = new BehaviorSubject<any>(null);
  private timersChangeSet = new Subject<any>();
  constructor(private http: HttpClient, private router: Router) {
    this.timersChangeSet.subscribe(val => this._timers.next(val))
}

  timers$ = this._timers.asObservable();

updateTimers(object) {
    this.timersChangeSet.next(object);
  }


  updateSingleTimer(timer,time,secs = false) {

// the code will result in infinity loop, of course. but how would i only get the value once?
    this.timers$.pipe(takeUntil(this._destroyed$)).subscribe((data:any) => {
      var newdata = data;
      newdata[timer] = time;
      this.updateTimers(newdata);
    });
  }

1 个答案:

答案 0 :(得分:1)

只需服用1

this.timers$.pipe(take(1), takeUntil(this._destroyed$))