Вызвать метод, когда нет наблюдателей для RxJs Тема - PullRequest
0 голосов
/ 14 февраля 2019

Как вызвать метод, когда все наблюдатели отписались от темы.

Обновление

const alphaStore = new BehaviourSubject(0);
observer1 = alphaStore.subscribe(console.log);
observer2 = alphaStore.subscribe(console.log);

И когда все эти наблюдатели отписались.Я хочу, чтобы метод был вызван.Как ...

Наблюдатель1 отписался

Наблюдатель2 отписался

Все наблюдатели оставили

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

То, что вы описываете, уже делает оператор finalize().Лучше сказать, finalize() вызывает свой обратный вызов, когда цепочка располагает, что означает, что он вызывается, когда все наблюдатели отписываются, цепочка завершается или выдает ошибки.

const subject = new Subject();
const shared = subject.pipe(
  finalize(() => console.log('finalize')),
  share(),
);

https://stackblitz.com/edit/rxjs-rebfba

Когда все наблюдатели отписываются share() отписывается от своего источника, что вызывает finalize().

В настоящее время нет способа определить, почему был вызван finalize().См. Этот выпуск https://github.com/ReactiveX/rxjs/issues/2823 и примеры того, как это сделать.

0 голосов
/ 14 февраля 2019

Вы можете создать собственный Observable, который будет отслеживать количество подписок.

Вот простой пример:

let count = 0;

const tracked$ = new Observable(() => {
  count++;

  return ()=>{
    count--;
    if (count === 0) {
      console.log('I am empty');
    }
  };
})

А затем объединить его с Observable, который выполняет реальную работу.Для простоты, давайте представим, что это просто таймер

// const tracked$ = ...

const data$ = Observable.timer(0, 5);

const result$ = data$
  .merge(tracked$)
  .take(5)
  .subscribe(value => console.log('v:', value));

После того, как 5 значений были переданы - он будет записывать I am empty.

Вот живой пример (с некоторой переписью и двумя подписками)):

https://observable -playground.github.io / gist / 4a7415f3528aa125fb686204041138cb

ПРИМЕЧАНИЕ. В этом коде используется нотация rxjs-compat, которую прощечитать.В приведенном выше примере используется обозначение .pipe, которое сейчас более распространено.

Надеюсь, это поможет.

...