首页 > 解决方案 > RxJs - 没有订阅者处理错误时的默认错误处理程序

问题描述

我正在为我的 Angular 6 应用程序中的 RxJs寻找一个可覆盖的默认错误处理程序。寻找以下行为

我的服务.ts

getArticle(id: string) {
  return this.http.get<Article>(`/api/articles/${id}`).pipe(
    defaultHandler(err => {
      console.log('Default error handler', err);
      // TODO Show dialog saying: err.data.msgFromServer || 'Unknown error'
    })
  );
}

案例 1:没有订阅者处理错误

myService.getArticle('1234').pipe(map(...), ...otherOperators)
  .subscribe(this.onNext); // Default error handler HttpErrorResponse {...}

案例 2:至少一个订阅者处理错误

myService.getArticle('1234').pipe(map(...), ...otherOperators)
  .subscribe(this.onNext, err => console.log('Hi from subscriber'));
// Hi from subscriber

标签: javascriptangulartypescriptrxjs

解决方案


handleError()是您的 http 拦截器的默认错误处理程序的示例。它在这里处理一般的 http 错误并将其 parameter( 'Error Occured') 发送到您订阅的任何地方postCall()

export class Http extends HttpClient {

   constructor(httpHandler: HttpHandler) {
      super(httpHandler);
   }

   postCall(url: string, body, options?): Observable<any> {
      return super.post(url, body, options)
          .pipe(
             tap(response => { console.log(response) }),
             catchError(this.handleError('Error Occured')));
             // 'Error Occured' or anything here goes to anywhere you subscribe postCall() as response
   }

  private handleError<T>(result?: T) {
     return (error: any): Observable<T> => {
        console.error('Status: ', error.status); // Example output 'Status: 401'
        return of(result as T);
     };
  }
}

推荐阅读