javascript - 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 时隐藏。
解决方案
如果你想在源 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