2017-08-29 5 views
0

オブザーバブルを1つにマージし、すべてのサブジェクトが値を発行したときにサブスクライブしたいとします。これまでのところ、私は Observableをマージして、すべてのサブジェクトが値を発行したときに処理を実行します。

public A:Subject<any> = new Subject(); 
public B:Subject<any> = new Subject(); 
public C:Subject<any> = new Subject(); 
public D:Subject<any> = new Subject(); 
public Complete:Subject<any> = new Subject(); 

A.next(true); 
B.next(true); 
C.next(true); 
D.next(true); 

Observable.zip(A,B,C,D).subscribe(res=>{Complete.next(true)}) 

Observable.mergeとObservable.zip

を試みた。しかし、私は上記行う場合、私は、加入者がいない、値を発するようにA、B、CまたはDの件名のいずれかに耳を傾けるだろうと思いますすべて。 A、B、C、Dがすべて値を出力するまで待つ方法は何でしょうか?

答えて

0

Observable.forkJoinは、すべてのソースオブザーバブルが少なくとも1つの値を出力し、それらのすべてが完了するまで待機します。しかし、あなたは科目を使っているので、完了しない可能性が非常に高いです。.zip()を使うと意味があります。

zip()オペレータは、すべてのソースがXの値を放出した場合にのみ、Xを送信します。あなたの場合、zip()は、すべてA,B,CおよびDが少なくとも1つのアイテムを放出する場合にのみ単一のアイテムを放出します。

あなたがmergeを使用している場合しかし、それはABCDのいずれかの項目を発するたびに放出します。

ライブデモ:可能であればhttp://jsbin.com/hihutoj/8/edit?js,output

+0

あなたはplunkrを私に提供することができますか?私のコードでその正確なコードを試してみると、zip演算子は何も出さないので.... – PowerLove

+0

http://jsbin.com/hihutoj/8/edit?js,output – martin

+0

もちろん、あなたはまず購読する必要があります'next()'を呼び出してください:) – martin

関連する問題