【问题标题】:Invoke method when no observers for RxJs Subject当 RxJs Subject 没有观察者时调用方法
【发布时间】:2019-07-08 09:47:26
【问题描述】:

当所有观察者都取消订阅一个主题时如何调用方法。

更新

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

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

Observer1 已退订

Observer2 已退订

所有观察者离开

【问题讨论】:

  • 你能举个代码例子吗?不清楚。
  • 用@MohamedGara 代码示例更新了问题

标签: rxjs observers subject


【解决方案1】:

您可以创建一个自定义的 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 表示法,现在更常见。

希望这会有所帮助。

【讨论】:

    【解决方案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 以及有关如何操作的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多