rxjs - 返回 Observable 类型的 rxjs 函数
问题描述
我正在尝试将以下可观察代码从使用 Observable.create 转换为使用可管道运算符。
public getUnrecoveredGearsAfterDep(): Observable<void> {
return Observable.create((observer) => {
this.vesselDetailService.getVessel().subscribe(
(vessel: Vessel) => {
console.log(vessel.cfr);
this.getAndUpdateUnrecoveredGears(vessel.cfr).subscribe(
() => {
observer.next(null);
observer.complete();
},
(error) => {
observer.error(error);
}
);
},
(error) => {
observer.error(error);
}
);
});
}
我尝试了以下方法,但出现转换错误,无法将 Observable.unknown 类型转换为 Observable.void 任何帮助将不胜感激。
public altGetUnrecoveredGearsAfterDep(): Observable<void> {
return this.vesselDetailService.getVessel().pipe(
tap( (vessel: Vessel) => console.log(vessel.cfr)),
switchMap((vessel: Vessel) => this.getAndUpdateUnrecoveredGears(vessel.cfr)),
map((gears: GearSet[]) => of())
);
}
解决方案
您的问题是您将输出映射到of()
可观察的。这使您的函数返回类型为Observable<Observable<never>>
.
您的地图应该简单地返回undefined
或null
,您不需要of
:
public altGetUnrecoveredGearsAfterDep(): Observable<void> {
return this.vesselDetailService.getVessel().pipe(
tap( (vessel: Vessel) => console.log(vessel.cfr)),
switchMap((vessel: Vessel) => this.getAndUpdateUnrecoveredGears(vessel.cfr)),
map((gears: GearSet[]) => undefined)
);
}
此外,您可以通过使用mapTo
和删除类型注释来简化:
public altGetUnrecoveredGearsAfterDep(): Observable<void> {
return this.vesselDetailService.getVessel().pipe(
tap(vessel => console.log(vessel.cfr)),
switchMap(vessel => this.getAndUpdateUnrecoveredGears(vessel.cfr)),
mapTo(undefined)
);
}
推荐阅读
- python - 访问 Django 模板的 ManyToManyField 内容
- python - 如何为显式等待创造条件?
- python - 如何在不知道确切坐标的情况下使用 OpenCV 裁剪图像?
- java - 如何使在 farget/EC2 上运行的 Docker 容器可以在没有任何默认凭据的情况下访问 KMS?
- dart - 在 Google Doc 上添加评论的问题(完成从 Google Doc 检索评论所需的所有工作)
- mysql - Laravel 8 迁移:DB:unprepared 不适用于共享托管服务器
- sql - 重复数据 1 到 2 到 1 : 1 sql join
- jenkins - 运行批处理文件是正常的,但是在 Jenkins 中运行时出现错误
- javascript - ReactJS:函数返回[对象,对象]
- css - 是否有 css max-top 属性