限制rxjs observable的订阅数量

时间:2017-07-26 07:59:15

标签: angular typescript rxjs observable

我想找到一个可观察,主题或事件发射器更换,它在任何给定时间都支持一个且只有一个订阅。即第一个获得订阅的人将有权执行其订阅的机构,当它取消订阅时,任何下一个订阅者都将被允许继续。

当前是否存在支持此功能的可观察,主题或事件发射器内的任何方法,或者是否存在可以允许此行为的替换方法。

或者,如果有一些技术可以执行某些功能,当有人从我们的目标发射器订阅/取消订阅时,我可以使用访问修饰符和布尔值来执行此功能。

目前我正在尝试这样的事情:

  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。

有没有更好的内置方法?

1 个答案:

答案 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');
});