2017-03-16 9 views
1

ストリームをマージしてすべてのサブスクライバをリフレッシュすることを楽しみにしています。ストリームをマージするRxJs

機能的なプログラミング目的のために、concatは現在のobservableを更新せず、私はそれを行う正しい方法が得られません。

これは、私は物事が起こるしたいと思いますか:

var observable = Rx.Observable.from(['stream1']); 
var subscription = observable.subscribe(
    function(x) { 
     console.log('Next: ' + x); 
    }, 
    function(err) { 
     console.log('Error: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 
observable.concat(Rx.Observable.from(['stream2'])); 

このコードは、最初のストリームを読み込み完了になります。 concatの場合、新しいObservableが作成されます。最初は既にObservableを購読しています。

私は最初の観測を押し込むことができないので、それを行う正しい方法は何ですか?

ありがとうございます!何をしようとする

答えて

2

は、そのような正確ことはできませんが、基本的に行くには2つの選択肢があり、両方がSubjectの使用を伴う:

1)データ

const obs$ = Rx.Observable.of("stream1"); 
const subj$ = new Rx.Subject(); 

Rx.Observable.merge(obj$, subj$) 
    .subscribe(
     x => console.log('Next: ' + x), 
     x => console.log('Error: ' + x), 
     () => console.log('Complete') 
    ); 

subj$.next("stream2"); 
subj$.next("stream3"); 
のマニュアル発光

ただし、このケースでは、Subjectは一度も完了しないため、の完全なは呼び出されません。したがって、completeハンドラがトリガされる必要がある場合は、最後に手動のsubj$.complete();を追加する必要があります。被験者Subjectは、基本的にデータのみを伝播する「プロキシ」として作用するこのシナリオでは

const obs$ = Rx.Observable.of("stream1"); 
const subj$ = new Rx.Subject(); 

subj$.subscribe(
    x => console.log('Next: ' + x), 
    x => console.log('Error: ' + x), 
    () => console.log('Complete') 
); 

obs$.subscribe(x => subj$.next(x)); 
const obs2$ = Rx.Observable.of("stream2"); 
obs2$.subscribe(x => subj$.next(x)); 

スルー


2)マルチキャスト、ないエラー - または完全な、トリガー。

どちらのソリューションも本当に「良い」わけではありませんが、ご使用のケースを少し詳しく説明することはできますが、複雑な回避策がない適切な解決策があるはずです。あなたはそれにデータを放出し、でそれを購読することができ、それは方法で動作します -


あなただけ連続してデータを提供する方法を持つようにしたい場合は、永遠の観測を形成するには、BehaviorSubjectを使用する必要があります同じ時間:ここで

class Service { 
    public data$ = new BehaviorSubject(someInitialDataOrNull); 

    public getData() { 
     makeSomeHttpCall() 
      .subscribe(data => data$.next(data)); 
    } 
} 

class Component { 
    constructor() { 
     theService.data$.subscribe(data => console.log(data)); 
    } 
} 

+0

おかげであなたの答えのためにたくさん(それは基本的にはまだ同じようにonNextは電気ショック療法...、今nextであるために期待する働き)BehaviorSubjectの古いドキュメントへのリンクです。私の考えは、サービスがapiや他のソースから来るデータを観測可能に提供するということでした。私の他のコンポーネントは、それを購読しているので、最初から観測可能である必要があり、データが利用可能なときには、他のコンポーネントにフィードする必要があります。この目的のために正しいパターンは何でしょうか? – LeniM

+0

私は答えを更新しました – olsn

+0

ありがとうございます。あなたはそれを釘付けにした! – LeniM

関連する問題