Javascript 合并可观察对象并在所有对象都发出值时采取行动

Javascript 合并可观察对象并在所有对象都发出值时采取行动,javascript,rxjs,observable,subject,Javascript,Rxjs,Observable,Subject,我想把观测值合并成一个,然后在所有对象都发出一个值时订阅。到目前为止,我已经尝试了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(

我想把观测值合并成一个,然后在所有对象都发出一个值时订阅。到目前为止,我已经尝试了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)})
public A:Subject=new Subject();
公共B:主题=新主题();
公共C:Subject=新主题();
公共D:主题=新主题();
公共完成:主题=新主题();
A.下一个(正确);
B.下一个(正确);
C.下一个(正确);
D.下一步(正确);
Observable.zip(A,B,C,D).subscribe(res=>{Complete.next(true)})
但是如果我在上面做了,我想订阅者会听A、B、C或D主题中的任何一个来发出一个值,而不是全部。
等待A、B、C和D都发出一个值的方法是什么?

您可以使用
Observable.forkJoin
,它等待所有源可观测值发出至少一个值并全部完成。但是,因为您使用的是主题,所以很可能它们没有完成,所以使用
.zip()
是有意义的

zip()
运算符仅当所有源发出
X
值时才发出
X
th。在您的情况下,
zip()
仅当所有
a
B
C
D
至少发射一个项目时才会发射一个项目

但是,如果使用
merge
,则每当
A
B
C
D
中的任何一个发出一个项目时,它都会发出该项


现场演示:

如果可能的话,你能给我提供一个弹片吗?因为当我在我的代码中尝试那个精确的代码时,zip操作符不会发出任何信息……当然,您首先需要订阅,然后调用
next()
s:)啊,这让我发疯了。我不知道为什么同样的代码对我的Angular2项目不起作用。。。我只是在我的服务中有完全相同的东西,我调用该服务,但zip不会发出任何信息:(