【问题标题】:Merging Observable and take action when all subjects have emitted a value合并 Observable 并在所有主体都发出值时采取行动
【发布时间】:2018-02-07 02:37:41
【问题描述】:

我想将可观察对象合并为一个,然后在所有主题都发出值时订阅。到目前为止,我已经尝试过 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 都发出一个值?

【问题讨论】:

    标签: javascript rxjs observable subject


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如果可能的话,你能给我一个 plunkr 吗?因为当我在我的代码中尝试那个确切的代码时,zip 运算符不会发出任何东西......
    • 当然要先订阅,然后拨打next()s :)
    • 呃,这快把我逼疯了。我不知道为什么同样的代码不能在我的 Angular2 项目上工作......我的服务中只有完全相同的东西,我调用了服务,但是 zip 没有发出任何东西:(
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2016-08-28
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多