Вызвать метод, когда нет наблюдателей для RxJs Тема
Как вызвать метод, когда все наблюдатели отписались от темы.
Обновить
const alphaStore = new BehaviourSubject(0);
observer1 = alphaStore.subscribe(console.log);
observer2 = alphaStore.subscribe(console.log);
И когда все эти наблюдатели отписываются. Я хочу, чтобы метод был вызван. Подобно...
Observer1 отписался
Observer2 отписался
Все наблюдатели оставили
2 ответа
То, что вы описываете, уже делает 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 и примеры там, как это сделать.
Вы можете создать собственный 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
обозначение, которое является более распространенным в настоящее время.
Надеюсь это поможет.