如何捕获RxJS 5.5中的错误

时间:2017-11-28 17:58:08

标签: angular rxjs rxjs5

我正在使用Angular 5和RXJS 5.5

在我做这样的事之前

getProjectInfo(id): Observable<any> {
    const URL = `${this.API}/${id}`;
    return this.http.get(URL)
      .pipe(map(res => res)),
      catchError(this.handleServerError);
}

handleServerError(error: any) {
    console.log(error.error || error.json() || error);
    return Observable.throw(error.error || error.json() || error || 'Server error');
}

但是现在我收到了这个错误

Error:(21, 5) TS2322:Type 'UnaryFunction<Observable<{}>, Observable<any>>' is not assignable to type 'Observable<any>'.
  Property '_isScalar' is missing in type 'UnaryFunction<Observable<{}>, Observable<any>>'.

我也试过这个

getProjectInfo(id): Observable<any> {
    const URL = `${this.API}/${id}`;
    return this.http.get(URL)
      .pipe(map(res => res)),
      catchError(err => this.handleError('getProjInfo', URL));
}
private handleError(method: String, URL: string): any {
  return (err: any) => {
    const errMsg = `error in ${method}() retrieving ${URL}`;
    console.log(`${errMsg}:`, err);
    if (err instanceof HttpErrorResponse) {
      console.log(`status: ${err.status}, ${err.statusText}`);
    }
    return Observable.throw(errMsg);
  };
}

我做错了什么?

3 个答案:

答案 0 :(得分:11)

请记住括号。您返回pipe结果,catchEror结果除以,

return this.http.get(URL)
  .pipe(map(res => res)),
  catchError(this.handleServerError);

将一个支架放在自己的位置:

return this.http.get(URL)
  .pipe(
    map(res => res),
    catchError(this.handleServerError)
  );

答案 1 :(得分:3)

我认为您接受的答案是正确的。

使用管道语法,我相信它应该是这样的:

return this.http.get(URL)
  .pipe(

    map(res => doStuff(res)),

    catchError(err => {
      this.handleServerError(err);
      return this.resDummyData;
    })

  );

使用catchError运算符时,您需要使用订阅所需格式的数据再次返回observable。否则,如果下游订阅中的逻辑因为缺少实际的http响应数据而失败,捕获错误将无济于事......

或者,您可能希望使用其他rxjs运算符(例如重试或重试),而不是catchError,具体取决于您的用例。

好文章:Simple Error Handling in RxJS

答案 2 :(得分:-2)

您的管道不正确。请改为:

std::list

正如马丁所说,它应该在管道内。