Обновление специального элемента в поведении субъекта или подписка только один раз - PullRequest
0 голосов
/ 12 апреля 2019

У меня 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$?

В: также, возможно ли обновить один элемент проще, чем то, что я сейчас делаю?

полный код:

  _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 Ответ

1 голос
/ 12 апреля 2019

Просто возьми 1

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