Как правильно распространять ошибки через catchError ()? - PullRequest
0 голосов
/ 11 мая 2018

Я написал функцию, которая pipe -able:

HandleHttpBasicError<T>()
{
    return ((source:Observable<T>) => {
        return source.pipe(
            catchError((err:any) => {
                let msg = '';
                if(err && err instanceof HttpErrorResponse)
                {
                    if(err.status == 0)
                        msg += "The server didn't respond";
                }
                throw {
                    err,
                    msg
                } as CustomError
            })
        )

    })
}

Я могу использовать эту функцию таким образом в моем HttpService:

checkExist(id:string)
{
    return this.http.head<void>(environment.apiUrl + 'some_url/' + id)
        .pipe(
            HandleHttpBasicError(),
            catchError((err:CustomError) => {
                if(err.msg)
                    throw err.msg;
                if(err.err.status == HttpStatusCodes.NOT_FOUND)
                    throw("It doesn't exist.");
                throw(err);
            })

        )
}

Она отлично работает.Когда я подписываюсь на checkExist(), я получаю хорошее сообщение об ошибке, потому что HandleHttpBasicError сначала перехватывает ошибку и выдает ее в catchError() службы, которая выдает сообщение об ошибке, потому что это не было null.

Таким образом, это позволяет мне иметь глобальный catchError(), который обрабатывает сообщения об ошибках, которые всегда будут одинаковыми.В будущем я сделаю это в HttpHandler, но здесь дело не в этом.

Можно ли связывать ошибки с ключевым словом throw?

Я пыталсяreturn Observable.throwError(), но браузер сказал

Observable.throwError не является функцией

Мой импорт import {Observable, of, throwError} from 'rxjs';.

Нелучше сделать это:

return ((source:Observable<T>) => {
        return source.pipe(
            catchError((err:any) => {
                msg = '';
                ...
                return of({err, msg} as CustomError)
                /* instead of
                throw(err)
                -or-
                return Observable.throwError(err) (which doesn't work)
                */
            })
        )

    })

?

1 Ответ

0 голосов
/ 11 мая 2018

Можно ли связывать ошибки с ключевым словом throw?

Да, все в порядке.rxjs try-перехватывает такие случаи и преобразует их в уведомление об ошибке.

Я пытался вернуть Observable.throwError (), но браузер говорит: «Observable.throwError не является функцией»

В rxjs6 прототип Observable больше не изменяется, чтобы содержать операторы или эти «операторы создания», вместо этого они представляются как автономные функции.Вы можете прочитать больше об этом здесь , но суть в том, что вы просто return throwError(…), например

return source$.pipe(
  catchError(err => err.code === 404 
    ? throwError("Not found")
    : throwError(err)
  )
)
...