我想找到一个可观察,主题或事件发射器更换,它在任何给定时间都支持一个且只有一个订阅。即第一个获得订阅的人将有权执行其订阅的机构,当它取消订阅时,任何下一个订阅者都将被允许继续。
当前是否存在支持此功能的可观察,主题或事件发射器内的任何方法,或者是否存在可以允许此行为的替换方法。
或者,如果有一些技术可以执行某些功能,当有人从我们的目标发射器订阅/取消订阅时,我可以使用访问修饰符和布尔值来执行此功能。
目前我正在尝试这样的事情:
private OpenDialogEmitter = new EventEmitter();
private isFirstFetch: boolean = true;
getDialogEmitter(): EventEmitter<{}> {
if (this.isFirstFetch) {
this.isFirstFetch = false;
return this.OpenDialogEmitter;
}
return null;
}
setFirstFetch(){
this.isFirstFetch = true;
}
当有人取消订阅时,必须通过调用服务中的setFirstFetch()方法再次标记observable。
有没有更好的内置方法?
答案 0 :(得分:1)
很难说你为什么需要这个,因为有share
这样的运算符可以确保你只有一个订阅源Observable。
由于EventEmitter
扩展了Subject
类,您可以检查它是否包含以下订阅(请参阅https://github.com/ReactiveX/rxjs/blob/master/src/Subject.ts#L28):
const source = new Subject();
...
if (source.observers.length > 0) {
...
}
如果您想对订阅/取消订阅执行某些操作,可以使用Observable.defer()
并使用Subscription
方法向add()
对象添加自定义拆除功能:
const source = new Subject();
const o = Observable.defer(() => {
console.log('subscription');
return source; // or you can create the source inside this function if you want.
});
const subscription = o.subscribe(...);
subscription.add(() => {
console.log('unsubscription');
});