首页 > 解决方案 > Javascript rxjs - 当从 observable 发出最后一个值时做一些事情

问题描述

以下情况:我进行了两次异步 http 调用。


为简单起见:让我们假设第一个调用返回给我一个名称列表: ['marta', 'edgar', 'david']. 第二个 http 调用会在数据库中发布名称。我的实现可以很好地满足这个操作要求。它看起来如下:

public deployAllPartners(): void {
    this.isDeploying = true;
    this.getAllPartner().subscribe(shortname => this.adminService.deploySinglePartnerForTesting(shortname).subscribe());
}

private getAllPartner(): Observable<string> {
    return this.partnerService.getPartnersOverview()
        .flatMap((partnerList) => partnerList.partner) <== returns an array
        .map((partner) => partner.shortname);
}

问题:

现在我想要的是isDeploying在部署姓氏时布尔值变为 false。部署最后一个短名称时是否会触发任何RxJS 运算符?也许类似finally()或类似的东西?为了完整性:布尔值用于 HTML 中的加载 gif,并且 gif 仅在 UI 中显示isDeploying=true,当然当值为 false 时隐藏。

标签: javascriptrxjsobservable

解决方案


如果你想在源 Observable 完成后“结束”链,你可以使用concat或者从 RxJS 6.2.0 开始也可以使用 newendWith操作符。

或者,如果您不想附加任何值而只是做一些副作用,您可以在调用中使用complete处理程序。subscribe()

import { from, of } from 'rxjs';
import { concat } from 'rxjs/operators';

from(['a', 'b', 'c'])
  .pipe(
    concat(of('end')),
  )
  .subscribe({
    next: console.log,
    complete: () => console.log('completed'),
  });

查看现场演示:https ://stackblitz.com/edit/rxjs6-demo-tplu6y?file=index.ts


推荐阅读