Как мне остановить Observable.Timer() или Observable.Interval() автоматически через определенный период времени

public function(id: number) {
    this.periodicCheckTimer = Observable.timer(10000, 5000).subscribe(
        () => {
          let model = this.find(id);
          if (model['isActivated']) {
            this.periodicCheckTimer.unsubscribe();
          }
        });
  }

Я хочу автоматически остановить таймер через 5 минут, если условие if(model['isActivated']) не выполняется. Однако, если условие удовлетворяет, я могу остановить его вручную. Не уверен, что ручная остановка по-прежнему верна в этом случае.

Любые предложения с другими функциями таймера также приветствуются.


person Amit Chigadani    schedule 02.03.2017    source источник


Ответы (1)


Я не проверял, но вот альтернатива вашему предложению со стопом через 5 минут:

function (id: number) {
  // emit a value after 5mn
  const stopTimer$ = Observable.timer(5 * 60 * 1000);

  Observable
    // after 10s, tick every 5s
    .timer(10000, 5000)
    // stop this observable chain if stopTimer$ emits a value
    .takeUntil(stopTimer$)
    // select the model
    .map(_ => this.find(id))
    // do not go further unless the model has a property 'isActivated' truthy
    .filter(model => model['isActivated'])
    // only take one value so we don't need to manually unsubscribe
    .first()
    .subscribe();
}
person maxime1992    schedule 02.03.2017
comment
Что, если функция find() вернет наблюдаемое значение? например, если я сделаю это this.find(id).subscribe(), он вызовет функцию только один раз. - person Amit Chigadani; 02.03.2017
comment
Если find возвращает наблюдаемое, используйте для него switchMap, чтобы вы не подписывались на него сами, а switchMap сделал это за вас. - person maxime1992; 02.03.2017
comment
Понятно! takeUntil() была функцией, которую я искал. Спасибо!! Понравилось, как вы представили свой ответ. - person Amit Chigadani; 02.03.2017
comment
Рада, что понравилось и оказалось полезным :) - person maxime1992; 02.03.2017