了解《英雄之旅》 catchError实现

时间:2019-04-26 00:36:02

标签: angular typescript

我正在尝试通过Angular官方教程(《英雄之旅》)中的Http请求理解 catchError 的实现。

http请求的代码是这样的:

this.http.get<Hero[]>(this.heroesUrl)
.pipe(catchError(this.handleError<Hero[]>('getHeroes', [])));

在catchError内部,它传递了handleError函数,该函数这样实现(概述)

private handleError<T>(operation = 'operation', result?: T) {
  return (error: any): Observable<T> => {

    //Various operation with the error variable..

    return of(result as T);
  };
}

由于我是TypeScript的新手,所以我尝试阅读有关这种语法的文档(并且我还阅读了有关此代码段的其他问题),但没有找到答案:

return (error: any): Observable<T> => {

是什么意思?我不明白该怎么读:谁重视错误变量?怎么样?

我读到catchError需要一个具有2个参数的函数参数:err(这是错误)和catch(这是可观察到的源),但是我看不到这里如何对错误进行平均化。我以为在catchError中我必须传递handleError(err,catch)。

1 个答案:

答案 0 :(得分:1)

handleError不是您传递给catchError的函数,handleError是您调用的函数,因此它可以返回可以传递给catchError的函数。这使它成为higher-order function,利用了Javascript和Typescript函数是一等对象的事实。

返回的函数是arrow notation中的匿名函数,带有类型注释。如果没有类型,但使用更好的名称,可能会更有意义:

private getErrorHandler<T>(operation = 'operation', result?: T) {
  return (error) => {
    return of(result as T);
  };
}

类型仅表示通过调用handleError 返回的函数是接受错误并返回T类型的Observable的函数。

  

我了解到catchError需要一个具有2个参数的函数的参数:err(这是错误)和catch(这是可观察到的源代码)

在Javascript中,您总是可以提供比函数期望的更多的参数,并且该函数将简单地忽略多余的内容。 handleError返回的函数可能根本不使用源Observable,因此可以在Javascript中忽略它。表面上看是Typescript doesn't allow extra arguments和catchError definitely accepts a two-arg method,但是由于Javascript的灵活性,它允许您将one-arg方法转换为two-arg方法并丢弃第二个参数(请参见Typescript类型兼容性文档)。

使用function关键字来替代对同一事物进行措辞的另一种方式:

private createFunctionForCatchError<T>(operation, result) {
  return function(error, unusedSourceObservable) {
    // Discard error and return an Observable of the result.
    return observableOf(result);
  };
}