【问题标题】:Understanding Tour Of Heroes catchError implementation理解英雄之旅 catchError 实现
【发布时间】:2019-04-26 00:36:01
【问题描述】:

我在 Angular 官方教程(英雄之旅)中试图了解 catchError 在 Http 请求上的实现。

http请求的代码是这样的:

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

catchError内部,传入handleError函数,实现like this(总结)

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)。

【问题讨论】:

    标签: angular typescript


    【解决方案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 是源 observable

    在 Javascript 中,您总是可以提供比函数预期更多的参数,函数将简单地忽略额外的参数。 handleError 返回的函数想必根本没有使用源 Observable,所以在 Javascript 中可以省略。表面上是 Typescript doesn't allow extra arguments 和 catchError definitely accepts a two-arg method,但由于 Javascript 的灵活性,它允许您将单参数方法转换为双参数方法并丢弃第二个参数(请参阅 Typescript 类型兼容性文档中的 "Comparing two functions") .

    使用 function 关键字代替同一事物的另一种表达方式:

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

    【讨论】:

    • 非常感谢您的澄清,来自后端背景,有时很难用新的逻辑来思考,例如传递和返回函数作为参数,甚至更短的语法。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2017-11-21
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多