合并Observable并在所有主体都发出值时采取行动

时间:2017-08-29 15:02:56

标签: javascript rxjs observable subject

我希望将observable合并为一个,然后在所有主题都发出值时进行订阅。到目前为止,我已经尝试过Observable.merge和Observable.zip

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)})

但如果我在上面做,我认为订阅者将听A,B,C或D中的任何一个发出一个值,而不是ALL。 等待A,B,C和D都发出一个值的方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以使用等待所有源Observable发出至少一个值并且所有值都完成的Observable.forkJoin。但是,由于你正在使用主题,很可能它们没有完成,所以使用.zip()是有道理的。

zip()运算符仅在所有源发出X值时才会发出X个值。在您的情况下,zip()仅在所有ABCD排放至少一个项目时才会发出单个项目。

但是,如果您使用merge,则每当ABCD中的任何一个发出项目时,它都会发出。

现场演示:http://jsbin.com/hihutoj/8/edit?js,output