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

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

问题描述:

我希望将observables合并为一个,然后在所有主体发出价值时订阅。到目前为止,我已经试过Observable.merge和Observable.zip合并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)}) 

但是,如果我在上面做,我认为用户会听任何A,B,C或d受到的发射值,不所有。 等到A,B,C和D都发出价值的方法是什么?

您可以使用Observable.forkJoin等待,直到所有源Observable发出至少一个值,并完成所有值。但是因为你使用的是主题,所以它们很可能没有完成,所以使用.zip()是合理的。

zip()运营商发出X th只有当所有源发射X值。在您的情况下,zip()只会在所有AB,CD发出至少一个项目时才会发出单个项目。

但是,如果你使用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()'s :) – martin