Javascript rxjs-当可观察到的最后一个值发出时做些什么

时间:2018-08-07 10:09:14

标签: 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仅在isDeploying=true时才显示在UI中,并且当该值为false时当然是隐藏的。

2 个答案:

答案 0 :(得分:1)

如果要在源Observable完成后“结束”链,则可以使用concat,或者由于RxJS 6.2.0也可以使用新的endWith运算符。

或者,如果您不想附加任何值而只是产生一些副作用,则可以在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

答案 1 :(得分:1)

将finalize用于RXJS6:

this.getAllPartner().
.pipe(
    finalize(() => this.isDeploying = false)
  )