以下情况:我进行了两个异步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时当然是隐藏的。
答案 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)
)