2017-08-07 10 views
1

Observablesでイベントを発生させるAPIをラップしています。現在、私のデータソースコードはdb.getEventEmitter()EventEmitterを返しています。Observablesを遅延データソースとして使用する方法

const Datasource = { 
    getSomeData() { 
    return Observable.fromEvent(db.getEventEmitter(), 'value'); 
    } 
}; 

はしかし、実際にこれを使用するために、私はそうgetSomeData()に後続の各呼び出しは、シーケンス全体を再初期化し、より多くのイベントエミッターを再作成するまで、または任意のデータを持っていないと、両方の機能をmemoizeする必要があり、それがReplaySubject返してい私のコードは、多くのこのようなただ1つの機能のために定型のかなり多くをされて終わるすべての機能

const someDataCache = null; 
const Datasource = { 
    getSomeData() { 
    if (someDataCache) { return someDataCache; } 
    const subject = new ReplaySubject(1); 
    Observable.fromEvent(db.getEventEmitter(), 'value').subscribe(subject); 
    someDataCache = subject; 
    return subject; 
    } 
}; 

ために見えるので、望ましくなく、問題のより多くなると次の更新、ときそこにより多くのパラメータです。

これを達成するためのより良い/よりエレガントなデザインパターンはありますか?基本的に、私はそれをしたいと思います

  1. イベントエミッタは1つだけ作成されます。
  2. データソースを後で呼び出した呼び出し元は、最新の結果を取得します。
  3. イベントエミッタは、必要なときに作成されます。

しかし、今私はこのパターンがObservableパターンと戦っていると感じ、定型文句の束をもたらします。

+1

"引数セット"が意味するものは本当に明確ではありません。また、 'publishReplay'を見ましたか? http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-publishReplay – cartant

+0

@cartantああ、まさに私が探しているようだ!正しい方向に私を指してくれてありがとう。もしそれ以上の文書があればうれしいですが、私はいくつかの検索された例しか持っていません。 – kevmo314

+0

最後にドキュメントが届きます。あなたはいつでも[v4 docs](https://github.com/Reactive-Extensions/RxJS/tree/master/doc)に戻ることができます。 [v4とv5の間の変更](https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md)に慣れていれば、それでも便利です。 – cartant

答えて

0

この質問のフォローアップとして、私はこのようにObservablesを活用するロジックを共通化しました。言われたカートゥントが私に必要なもののほとんどを私に得させるので、publishReplay。私はthis postで学んだ内容を次のように書いています。drコード:

let first = true 
Rx.Observable.create(
    observer => { 
    const callback = data => { 
     first = false 
     observer.next(data) 
    } 
    const event = first ? 'value' : 'child_changed' 
    db.ref(path).on(event, callback, error => observer.error(error)) 
    return {event, callback} 
    }, 
    (handler, {event, callback}) => { 
    db.ref(path).off(event, callback) 
    }, 
) 
.map(snapshot => snapshot.val()) 
.publishReplay(1) 
.refCount() 
関連する問題