2016-06-14 4 views
4

を使用しての行動: を 'ちょっと'一つの観察可能な、複数の加入者、異なる場合、別のシェア()2人の加入者が観測を購読するとrxjs5

let s = Observable.interval(1000).take(2).do(x => console.log('hey')); 
    s.subscribe(n => console.log('subscriber 1 = ' + n)); 
    s.subscribe(n => console.log('subscriber 2 = ' + n)); 

コンソールには、次のログ'加入者1 = 0' 'ちょっと' '加入者2 = 0' 'ちょっと' '加入者1 = 1' 'ちょっと' '加入者2 = 1'

.share()使用:

let s = Observable.interval(1000).take(2).do(x => console.log('hey')).share(); 
    s.subscribe(n => console.log('subscriber 1 = ' + n)); 
    s.subscribe(n => console.log('subscriber 2 = ' + n)); 

コンソールログ:

'ちょっと' '加入者1 = 0' 'ちょっと' 「加入者 '2 = 1加入者1 = 0 ' '加入者2 = 1 '

これで、同じデータを複数のユーザに共有できました。

let s = Observable 
    .from([-1, 0, 1, 2, 3]) 
    .filter(v => v > 0) 
    .do(v => console.log('from', v)); 

    s.filter(v => v % 3 === 0) 
    .subscribe(v => console.log('---0---', v)); 
    s.filter(v => v % 3 === 1) 
    .subscribe(v => console.log('---1---', v)); 
    s.filter(v => v % 3 === 2) 
    .subscribe(v => console.log('---2---', v));   

ログ:

'から' 1 'から'、2 'から'、3 '--- 0 ---'、3 '' から次のテストを実行する 、1 '--- 1 ---'、1 'from'、2 'from'、3 'from'、2 '--- 2 ---'、2 'from'、3

let s = Observable 
    .from([-1, 0, 1, 2, 3]) 
    .filter(v => v > 0) 
    .do(v => console.log('from', v)) 
    .share(); 

    s.filter(v => v % 3 === 0) 
    .subscribe(v => console.log('---0---', v)); 
    s.filter(v => v % 3 === 1) 
    .subscribe(v => console.log('---1---', v)); 
    s.filter(v => v % 3 === 2) 
    .subscribe(v => console.log('---2---', v)); 
}); 

はもう一度、私はshare()を使用しました

share()を使用したにもかかわらず、fromデータは、share()(1から2のうち3つがそれぞれ3回記録され、各サブスクライバごとに1つずつ記録されます)を除いた以前の試行とまったく同じ方法で記録されました。

したがって、これらの例の観測値の違いは何ですか?

2番目のケースでデータを共有するにはどうすればよいですか?

答えて

3

Rxjs 4では、from 1 from 2 from 3が1回だけ表示されます。ただし、フィルタロギングは1つしかありません。 Rx.Observable.from(array)はそのシーケンスを同期して発光しています。したがって、s.filter(v => v % 3 === 0).subscribe(v => console.log('---0---', v));が実行されると、あなたのsがすでに完了しています。あなたはそれをここに見ることができます:[jsfiddle]shareオペレータは今、それが終了したソースと新たな加入者が加入を再起動し、Rxjs 5では

from 1 
from 2 
from 3 
---0--- 3 

:出力です。 2番目のフィルタでは、sが再開されます。だから、あなたはソースシーケンスの生産プロセスを通して3回行きます。

これを納得させるには、同期シーケンスを非同期シーケンスjsfiddleに変更します。あなたは今、あなたが期待したものである、取得する必要があります。

from 1 
---1--- 1 
from 2 
---2--- 2 
from 3 
---0--- 3 

不思議なことに、これはmigration guideに記載されていません。しかし、変更の動機についての情報を見つけることができますherehere(要するに、改善されたのはrepeatretryのセマンティクスです)。

つまり、publish().refCount()を使用すると、Rxjs 4 share演算子を使用できます。しかし、前に説明したように、ソースが既に完了しているため、2番目のフィルタにはデータが表示されません。ここをクリックしてください:jsfiddle

関連する問題