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

标签 javascript rxjs observable subject

我想将 observables 合并为一个,然后在所有主题都发出值时订阅。到目前为止,我已经尝试过 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 中的任何一个主题发出一个值,而不是全部。 等到A、B、C、D都发出一个值,有什么办法呢?

最佳答案

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

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

但是,如果您使用 merge,它会在每次 ABC 时发出和 D 发出一个项目。

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

关于javascript - 合并 Observable 并在所有主题都发出值时采取行动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45942481/

相关文章:

angular - 在 Promise 中返回 Observable

Angular 4 - 从拦截器返回 HttpErrorResponse

javascript - jQuery 进度条未正确填充

javascript - jQuery 不更新变量信息

rxjs - 将前 3 个项目延迟 1 秒,第四个项目延迟 4 秒

node.js - RxJS - 从 EventEmitter 的多个事件创建 Observable

javascript - 如何过滤另一个数组中的数组

javascript - Fabric JS 组选择和缩放弄乱了单个对象位置属性

javascript - Kendo TreeView 移动父节点以更改排序顺序,但不允许将父节点拖到子节点下

angular - RxJs:forkJoin() 未运行,因为我的可观察列表不完整