2017-01-09 4 views
1

ファイルの追加/削除を発行するオブザーバブルを作成したいとします(chokidar経由)。私はこのようなもので、これを行うことができています:サブスクライバがない場合RxJs - サブスクライバがある場合のみ計算して出力します

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の新機能ですので、明らかな解決策がいくつかあります。これは可能ですか?

答えて

3

あなたは正しい軌道に乗っています。最初に、作成者it will be called when the subscription is cancelledから関数を返すと、それを使ってウォッチャーを破壊することができます。あなたの問題のほとんどを解決する必要があります

が、あなたは確実にしたい場合は、1つ「ウォッチャー」の最大値は、あなたが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(); 
関連する問題