返回 Observable<void> 类型的 rxjs 函数

dec*_*che 6 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);          
        }
      );    

    });
  }
Run Code Online (Sandbox Code Playgroud)

我已经尝试了以下方法,但收到转换错误 cant conversion type Observable.unknown to 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())      
    );
  }
Run Code Online (Sandbox Code Playgroud)

Biz*_*Bob 6

您的问题是您将输出映射到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)      
    );
  }
Run Code Online (Sandbox Code Playgroud)

此外,您可以通过使用mapTo和删除类型注释来简化:

public altGetUnrecoveredGearsAfterDep(): Observable<void> {

    return this.vesselDetailService.getVessel().pipe(
      tap(vessel => console.log(vessel.cfr)),
      switchMap(vessel => this.getAndUpdateUnrecoveredGears(vessel.cfr)),
      mapTo(undefined)      
    );
  }
Run Code Online (Sandbox Code Playgroud)