首页 > 解决方案 > 返回 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())      
    );
  }

标签: rxjs

解决方案


您的问题是您将输出映射到of()可观察的。这使您的函数返回类型为Observable<Observable<never>>.

您的地图应该简单地返回undefinednull,您不需要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)      
    );
  }

推荐阅读