代码之家  ›  专栏  ›  技术社区  ›  SimplGy

如果RxJs主题的refCount降为零,请执行某些操作

  •  1
  • SimplGy  · 技术社区  · 7 年前

    我正在研究一个管理订阅的服务层。

    我向消费者提供主题支持的观察结果如下:

    const subject = new Subject();
    _trackedSubjects.push(subject);
    return subject.asObservable();
    

    我想监控一下 subject.observers 如果它降回0,在我的库中做一些清理。

    我已经查看了refCount,但这只在observeable上可用。

    我很想找到这样的东西:

    subject.onObserverCountChange((cur, prev) =>
      if(cur === 0 && prev !== 0) { cleanUp(subject) }
    )
    

    有没有办法像这样对一个主题进行自动清理?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Oles Savluk    7 年前

    而不是使用 Subject -您可能应该在创建observable时描述设置/清理逻辑。参见示例:

    const { Observable } = rxjs; // = require("rxjs")
    const { share } = rxjs.operators; // = require("rxjs/operators")
    
    const eventSource$ = Observable.create(o => {
      console.log('setup');
      let i = 0
      const interval = setInterval(
        () => o.next(i++),
        1000
      );
    
      return () => {
        console.log('cleanup');
        clearInterval(interval);
      }
    });
    const events$ = eventSource$.pipe(share());
    
    const first = events$.subscribe(e => console.log('first: ', e));
    const second = events$.subscribe(e => console.log('second: ', e));
    
    setTimeout(() => first.unsubscribe(), 3000);
    setTimeout(() => second.unsubscribe(), 5000);
    <script src="https://unpkg.com/rxjs@6.2.2/bundles/rxjs.umd.min.js"></script>