订阅 combineLatest 中的所有 observables

Posted

技术标签:

【中文标题】订阅 combineLatest 中的所有 observables【英文标题】:Subscribe to all observables in a combineLatest 【发布时间】:2020-01-23 06:59:03 【问题描述】:

在我的代码中,我打开一个matDialog 允许提取 XLSX。

打开此matDialog 时,数据会加载到ngOnInit(),这可能需要一些时间。 这就是为什么我使用combineLatest()filter() 允许我等待三个查询的结果以允许提取。 我现在想添加一个mat-progress-bar determinate 来查看提取的去向。 为此,我希望能够根据收到的每个结果修改我的变量 progress

所以我在每个请求上都使用了map(result => this.progress = this.progress + 30; 来增加进度。 它有效,但打破了我的combineLatest()。进度停止在 90%,我找不到解决方案。

代码:

this.subscriptions$.add(combineLatest([
    this.storeWallets.loadInvoiceExtractionProduct(this.selectedWallet).pipe(
        //map(result =>  this.progress = this.progress + 30; ),
        catchError(err => 
            console.error(err.message);
            return of(err);
        )
    ),
    this.storeWallets.loadInvoiceExtractionSupport(this.selectedWallet).pipe(
        //map(result =>  this.progress = this.progress + 30; ),
        catchError(err => 
            console.error(err.message);
            return of(err);
        )
    ),
    this.storeWallets.loadInvoiceExtractionTraining(this.selectedWallet).pipe(
        //map(result =>  this.progress = this.progress + 30; ),
        catchError(err => 
            console.error(err.message);
            return of(err);
        )
    ),
    ]).pipe(
        filter(results => results.every(res => !!res))
    ).subscribe(results => 
        //this.progress = 100;
        document.body.style.cursor = "default";
        this.waitExtraction = false;
    )
);

感谢您的帮助。

【问题讨论】:

【参考方案1】:

这一行:

map(result =>  this.progress = this.progress + 30; ),

将获取每个结果并返回undefined,因为没有返回语句(因此filter 将过滤掉结果,并且不会运行订阅者)。将 map 替换为 tap 运算符,它应该可以工作。

【讨论】:

以上是关于订阅 combineLatest 中的所有 observables的主要内容,如果未能解决你的问题,请参考以下文章

combineLatest没有被调用

OC + RAC combineLatest和merg

关于 RxSwift/RxCocoa 与 combineLatest 绑定的问题

RxSwift。结合最新。并不是所有的 observables 都发出了

kotlin 中的 Observable.combineLatest 类型推断

如何提供一个Rxjs observable作为使用Jasmine中的combineLatest的方法的数据