【问题标题】:RxJs - Calculate & emit values only if there is a subscriberRxJs - 仅在有订阅者时计算和发出值
【发布时间】:2017-01-09 21:12:27
【问题描述】:

我想创建一个发出文件添加/删除的 observable(通过chokidar)。我可以通过这样的方式做到这一点:

Rx.Observable.create((subscriber) => {
  this.watcher = chokidar.watch(
     this.contentPath
  );
  this.watcher.on('addDir', () => { subscriber.next(); });
  this.watcher.on('unlinkDir', () => { subscriber.next(); });
});

我想做的是,我想停止观看文件,如果没有订阅者,当有人订阅它时重新开始。像这样,但使用 RxJs:

class Notifier {
  constructor() {
    this.subscriberCount = 0;
  }

  subscribe(onNext, onError, complete) {
    this.subscriberCount++;
    if (this.subscriberCount === 1) {
      this.startInternalWatcher();
    }
    return () => {
      this.subscriberCount--;
      if (this.subscriberCount === 0) {
        this.stopInternalWatcher();
      }
    }
  }
}

// files are not watched
const n = new Notifier();

const s1 = n.subscribe(() => {}) // files are being wacthed
const s2 = n.subscribe(() => {}) // files are being wacthed
s1() // unsubscribed from 1, files are still watched.
s2() // unsubscribed from 2, files are not watched because no one is interested in.

我是 RxJs 的新手,所以我可能会遗漏一些明显的解决方案。这可能吗?

【问题讨论】:

    标签: rxjs rxjs5


    【解决方案1】:

    你在正确的轨道上。首先,如果你从创建者it will be called when the subscription is cancelled 返回一个函数,那么你可以使用它来销毁观察者。

    这应该可以解决您的大部分问题,但是如果您想确保一次最多有一个“观察者”,您可以添加refCount

    return Rx.Observable.create((subscriber) => {
      this.watcher = chokidar.watch(
         this.contentPath
      );
      this.watcher.on('addDir', () => { subscriber.next(); });
      this.watcher.on('unlinkDir', () => { subscriber.next(); });
    
      return () => this.watcher.off('addDir unlinkDir');
    })
    .publish()
    .refCount();
    

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      相关资源
      最近更新 更多