Использование catchError () внутри pipe () показывает ошибку в переменной .subscribe - PullRequest
1 голос
/ 18 февраля 2020

Я хотел обработать ошибки для метода в angular. Я прочитал, что могу использовать catchError () внутри .pipe (). Когда я добавил проверку catchError, я получаю переменную roomId, помеченную красной волнистой линией, которая говорит: TS2345: Argument of type 'unknown' is not assignable to parameter of type 'number'

Это часть, где я делаю проверку ошибок.

this.firstRoom(room).pipe(
        first(), 
        catchError((error: HttpErrorResponse)=>{
             if(error.status != 200){
               // handle error
             }else{
               // return error
               return throwError(error);
            }
         }),

А вот и полный метод.

public findRoom(room: Room): Observable<house> {
    return new Observable(house => {
      this.firstRoom(room).pipe(
        first(), 
        catchError((error: HttpErrorResponse)=>{
                  if(error.status != 200){
                    // handle error
                  }else{
                    // return error
                    return throwError(error);
                  }
                }),
      ).subscribe(roomId => 
        this.gointToThisRoom(roomId).pipe( <----- roomId throws that argument type unknown
          first()
        ).subscribe(roomInfo => {
            if (roomInfo.status === "failed") {
              house.next(house.failed);
            } else {
              this.downloadRoom(roomId).pipe(
                first()
              ).subscribe(blobFile =>
                this.getRoom(blobFile, name)
              );
              house.next(house.ready)
            }
          }
        )
      )
    });
  }

Есть идеи, почему это так?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020
  1. Не использовать конструктор new Observable с подпиской внутри подписки. Трудно следовать логике c, и вы не можете просто отменить отложенные операции, отменив подписку.

  2. И // handle error фактически должны обработать ошибку.

Я бы сделал что-то вроде этого:

public findRoom(room: Room): Observable < house > {
    return this.firstRoom(room).pipe(
        first(),
        catchError((error: HttpErrorResponse) => {
            if (error.status != 200) {
                return EMPTY;
            } else {
                // return error
                return throwError(error);
            }
        }),
        switchMap(roomId => this.gointToThisRoom(roomId)),
        first(),
        // ... the rest of the pipe
    );
}
1 голос
/ 18 февраля 2020

catchError ожидает, что вы вернете наблюдаемое, которое может быть throwError или, если вы обработали его, новое наблюдаемое в качестве запасного значения.

В вашем случае вы можете сделать что-то вроде этого:

import { of } from 'rxjs';

...

catchError((error: HttpErrorResponse) => {
  if (error.status != 200) {
    // handle error and use any value you like to return if that's your goal.
    // This could be anything, like a number, string or an object, depending on your use-case.
    const fallbackValue: Room = { properties... };
    return of(fallbackValue); // You will get this in your subscription callback
  } else {
    // return error
    return throwError(error);
  }
}),
...