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
が最初にエラーをキャッチし、null
ではないためエラーメッセージをスローするサービスのcatchError()
にスローするため、適切なエラーメッセージが表示されます。
このようにして、常に同じになるエラーメッセージを処理するグローバルcatchError()
を持つことができます。将来的には、HttpHandler
で実行しますが、それはここでのポイントではありません。
throw
キーワードでエラーを連鎖させても大丈夫ですか?
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)
*/
})
)
})
?
Throwキーワードでエラーを連鎖させても大丈夫ですか?
はい、それはまったく問題ありません。 rxjsはそのような場合をキャッチし、エラー通知に変換します。
Observable.throwError()を返そうとしましたが、ブラウザは「Observable.throwErrorは関数ではありません」と言います。
Rxjs6では、Observable
プロトタイプは、演算子またはこれらの"作成演算子"を含むように変更されなくなり、代わりにスタンドアロン関数として公開されます。あなたはそれについてもっと読むことができます ここ 、しかしそれの要点はあなたがただreturn throwError(…)
したいということです。
return source$.pipe(
catchError(err => err.code === 404
? throwError("Not found")
: throwError(err)
)
)