2017-07-18 4 views
0

2つのAngular(1.6.4)コンポーネントとサービスがあります。サービスは私が4コンソールログを見ることを期待するこれらの行Observableが最新のサブスクライバにメッセージを送信するのはなぜですか

//Component 1 
service.observable.subscribe (v) => console.log('consumer A1: ' + v) 
service.observable2.subscribe (v) => console.log('consumer A2: ' + v) 
//Component 2 
service.observable.subscribe (v) => console.log('consumer B1: ' + v) 
service.observable2.subscribe (v) => console.log('consumer B2: ' + v) 

を持っていますが、代わりに、私は(A1を3を参照してください。この(CoffeeScriptの)のような2つの観測...私のコントローラで

// In service constructor 
@observable = Rx.Observable.create (source) => 
     source.next(123) 
@observable2 = Rx.Observable.create (source) => 
     @observer = source 
$timeout => 
     @observer.next(345) 
, 1000 

を作成し、 B1、B2)。なぜ私は外部から呼び出したときに最後のサブスクリプションだけが呼び出されますが、内部にあるときは呼び出されますか? 2つ目の例を両方とも呼び出す方法はありますか(好ましくはObservableとSubjectではなく)?

私がSubjectを使用すると、すべてが期待通りに機能しますが、なぜ私は観察可能であると期待しているように動作しないのか不思議です。

答えて

2

あなたのobservable2はサブスクライバを取得し、サブスクリプションを行うたびに変数(@observer)に格納しています。したがって、2番目のサブスクリプション(B2)が変数の値を置き換えています。

2番目のオブザーバーを書き換える正しい方法は、目標が何であるかが明確でないためです。科目は確実に働くことができます。目標に応じてObservable.timerも機能する可能性があります。

Observable.timer方法は次のようになります。それはサブスクライブ後にイベント1秒になるだろうことに加入して

@observable2 = Observable.timer(1000); 

何か。

+0

私が見逃していた部分は、誰かが購読するたびに新しいオブザーバーが作成されるということです。それが私が欠けていた部分でした。 – Jackie

関連する問題