2017-01-16 13 views
0

私はコードスニペット以下いますなぜ結果が共有されないのですか?

const source$ = Rx.Observable.from([1,2,3,4]) 
    .filter(x => x % 2) 
    .map(x => x * x) 
    .share(); 

source$.subscribe(x => console.log(`Stream 1 ${x}`)); 
source$.subscribe(x => console.log(`Stream 2 ${x}`)); 

その結果、私は
enter image description here

を持っている。しかし、私のような共有の結果除く午前:結果は取得していないのはなぜ

"Stream 1 1" 
"Stream 2 1" 
"Stream 1 9" 
"Stream 2 9" 

を共有ですか?

+0

RxJSは、可能な限り、同期の道を行くことにしようとする - この場合には、 'Rx.Observable.from([1,2,3,4])'することができ_ "done" _ synchronousであるから、まずstream1が表示されます。この場合、 "Stream1"は完了し、 "Stream2"はフローの新しいインスタンスを作成します。 – olsn

答えて

4

これは、あなたが低温Observable(http://reactivex.io/documentation/observable.html)を使用しているためです。

初めて購読するときは、refCount()演算子が使用され、そのソースObservable(Observable.from())にサブスクライブします。これはすべて同期的に起こりますので、サブスクライバのすべての値を送信してから完了します。refCount()は他のオブザーバが存在しないため、ソースからの登録を解除します。

次に、あなたは、第二のオブザーバーでサブスクライブし、これはすべて再び起こります。

publish()だけを使用してソースをConnectable観測可能にし、connect()を手動で呼び出すことができます。

const source$ = Rx.Observable.from([1,2,3,4]) 
    .filter(x => x % 2) 
    .map(x => x * x) 
    .publish(); 

source$.subscribe(x => console.log(`Stream 1 ${x}`)); 
source$.subscribe(x => console.log(`Stream 2 ${x}`)); 

source$.connect(); 

がライブデモを参照してください:https://jsbin.com/waraqi/2/edit?js,console

関連する問題