当 RxJs Subject 没有观察者时调用方法
Invoke method when no observers for RxJs Subject
如何在所有观察者都取消订阅某个主题时调用方法。
更新
const alphaStore = new BehaviourSubject(0);
observer1 = alphaStore.subscribe(console.log);
observer2 = alphaStore.subscribe(console.log);
当所有这些观察者都退订时。我想要调用一个方法。喜欢...
Observer1 unsubscribed
Observer2 unsubscribed
All observers left
您可以创建一个自定义 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
表示法,现在更常见。
希望对您有所帮助。
您描述的内容已经在 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 以及有关如何操作的示例。
如何在所有观察者都取消订阅某个主题时调用方法。
更新
const alphaStore = new BehaviourSubject(0);
observer1 = alphaStore.subscribe(console.log);
observer2 = alphaStore.subscribe(console.log);
当所有这些观察者都退订时。我想要调用一个方法。喜欢...
Observer1 unsubscribed
Observer2 unsubscribed
All observers left
您可以创建一个自定义 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
表示法,现在更常见。
希望对您有所帮助。
您描述的内容已经在 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 以及有关如何操作的示例。