我正在尝试通过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)。
答案 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);
};
}