没有RxJ主题的观察者时调用方法

时间:2019-02-14 11:18:24

标签: rxjs observers subject

所有观察者都未订阅主题时如何调用方法。

更新

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

当所有这些观察者都退订时。我想要一个方法被调用。喜欢...

  

Observer1取消订阅

     

Observer2取消订阅

     

所有观察者都离开了

2 个答案:

答案 0 :(得分:0)

您可以创建一个自定义的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表示法,这种表示法现在更加普遍。

希望这会有所帮助。

答案 1 :(得分:0)

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和其中的示例。