Как остановить наблюдателей в Observable.merge? - PullRequest
0 голосов
/ 29 октября 2019

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

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

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

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.

1 Ответ

1 голос
/ 29 октября 2019
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 - это значение, полученное из объединенных таймеров. Когда срабатывает один из таймеров, тогда слияние будет выдавать и это значение, это просто число, и у него нет метода отмены подписки.

...