У меня есть метод, который создает таймер:

 create(options: any) {
    return timer(0, 1000).pipe(
      map(() => {
        return options;
      }),
      takeWhile(() => new Date() < options.finishDate)
    );
  }

Затем этот таймер я добавляю в массив this.timers Observables:

this.timers.push(this.create({finishDate: new Date()}))

Когда я объединяю наблюдателей:

this.mergeObserver = Observable.merge(this.timers).subscribe(x => {
   console.log(x);
});

Я вижу, что console.log (x); продолжает работу, несмотря на то, что таймер был завершен.

Почему? А как остановить все таймеры в массиве?

Я могу отписаться здесь:

 Observable.merge(this.timers).subscribe(x => {
   x.unsubscribe();
});

Но это не останавливает Observable.merge .

0
Jony

1 ответ

this.mergeObserver = Observable.merge(this.timers).subscribe(x => {
   console.log(x);
});

В этом случае mergeObserver является не наблюдаемой, а подпиской. Метод подписки возвращает подписку. Поэтому переименование этого в mergeSubscription и вызов отписки для этого объекта - это как отписаться.

Если вы хотите ссылку на наблюдаемое, вам нужно подписаться после того, как вы взяли ссылку.

this.mergeObserver = Observable.merge(this.timers);

this.mergeSubscription = this.mergeObserver.subscribe(x => {
   console.log(x);
});

и затем вы отмените подписку с помощью объекта mergeSubscription.

Observable.merge(this.timers).subscribe(x => {
   x.unsubscribe();
});

Здесь вы не можете вызвать отмену подписки на x, поскольку x - это значение, которое получается из объединенных таймеров. Когда срабатывает один из таймеров, тогда слияние будет выдавать и это значение, это просто число, и у него нет метода отмены подписки.

58598965