2016-10-21 6 views
1

私はAngular2でobservableを使用しています。私が今まで知っているように、Observableの各インスタンスにはオブザーバ(1:1)があり、observer.next(value)で何かを出力するとき、observable.subscribe((value)=> {})でその値を取得できます。私は関数を作成外の値を発するようにしたいので、私は、対応するオブザーバを知らなくても値を発することができる方法Observableインスタンスがオブザーバ(またはサブスクライバ)なしで放出します

var observable = Observable.create(observer => { 
 
    observer.next(value); 
 
} 
 
.map(value=>{}) 
 
.catch(...) 
 
observable.subscribe(value => { 
 
    console.log(value); 
 
})

。 1つの可能な解決策はオブザーバをいくつかのグローバル変数に保存することですが、オブザーバブルで十分です。これについての任意の提案?

+2

おそらくあなたは['Subject'](https://github.com/ReactiveX/rxjs/blob/master/doc/subject.md)のようなものを探していますか? – cartant

+0

ああ、ObservableではなくSubjectを使ってこれを行うことができるようです。ありがとうございます!私はそれをさらに見るために時間がかかるでしょう。または私はおそらく私が必要としているクラスを作成することができると思う:) – dttung1412

+0

件名は行く方法です。また、それは1:1ではなく、複数回購読できることに注意してください。 – Meir

答えて

2

あなたは複数のものを一緒に混合しています。 Observablesはオブザーバと1対1の関係にありません(より正確には1:Nです)。手動で値を出力したい場合は、Subjectが同時にObservableとObserverとして機能する必要があります。実際には、これはnext()メソッドを呼び出すことができ、その値をすべての加入者(Observers)に伝えることを意味します。もっと読むhttp://plnkr.co/edit/gWMFMnPlLJVDC1pQi8pH?p=preview

Observer 1: 42 
Observer 2: 42 
Observer 1: test 
Observer 2: test 

がライブデモを参照してください:

import {Subject} from 'rxjs'; 

let source = new Subject(); 

source.subscribe(val => console.log('Observer 1:', val)); 
source.subscribe(val => console.log('Observer 2:', val)); 

source.next(42); 
source.next('test'); 

これは、コンソールに出力します:

は例えば活字体に次のコードを考えてみ

Observable.create()は非常に異なる動物であることに注意してください。新しいObserverがを購読するたびに呼び出される関数がパラメータとして使用されます。だからこそ、新しく加入したObserverを引数に取るのです。この関数では、例えばObserver上でnext()メソッドを呼び出して、すべてのサブスクライバが受信する必要があるいくつかのデフォルト値を送信することができます。

Observable.create()の代わりにSubjectを使用します。

+0

あなたの詳細な答えをありがとうが、もう少し混乱して、 'Subject 'で' map'演算を使うことができます – dttung1412

+0

@ dttung1412もちろんです。 'Subject'は' Observable'を拡張するので、すべての演算子を 'Observable'として扱います。http://reactivex.io/rxjs/class/es6/Subject.js~Subject.html – martin

関連する問題