0

我正在阅读 Angular 在https://angular.io/tutorial/toh-pt6的教程,我有几个问题。我的第二个问题与这里提出的关于同一个 Angular 演示的问题非常接近,但尽管它几乎涉及到我的特定语法问题,但它只是简短,并且一个响应没有涉及到它。

从调用返回的 Observable 中检索服务中的数据HttpClient.get,它们catchError在管道中有一个运算符:

/** GET heroes from the server */
getHeroes(): Observable<Hero[]> {
  return this.http.get<Hero[]>(this.heroesUrl)
    .pipe(
      tap(_ => this.log('fetched heroes')),
      catchError(this.handleError<Hero[]>('getHeroes', []))
    );
}

这点我明白了。我希望this.handleError返回一个处理程序,一个错误到处理错误的代码的映射。在他们已经提供的页面上再往上一点:

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

    // TODO: send the error to remote logging infrastructure
    console.error(error); // log to console instead

    // TODO: better job of transforming error for user consumption
    this.log(`${operation} failed: ${error.message}`);

    // Let the app keep running by returning an empty result.
    return of(result as T);
  };
}

首先,我注意到虽然这些示例的类型很多,但这个示例似乎没有输入返回值。我期待

private handleError<T>(operation = 'operation', result?: T) **: some type** {

其次,我认为函数返回的是 lambda 表达式映射Observable<T>到大括号之间的大块代码(它本身最终返回result,我们希望在发生错误时返回给订阅者的安全默认值,以便它可以继续处理,用 ) 包裹在 Observable 中of。但我不明白 lambda 表达式之前第二行的语法:

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

什么是return (error: any):,位于函数定义内部handleError,它与它后面的内容有什么关系?第二个冒号的句法意义是什么?它代表了它两边的表达式之间的什么关系?

4

1 回答 1

0

我想到了。但这是我遇到过的最令人困惑的语法细节之一。如果它被写

return (error: any) => { ...

我会认为它是将调用error的东西映射到左大括号与其匹配的右大括号之间的代码返回的任何内容。它指定error可以是任何东西,并且没有说明大括号之间的代码预期返回的值的类型。

的插入: Observable<T>

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

: string是此函数定义中的箭头函数对应物:

function foo(x: any) : string { /* code that must return a string */ }

这意味着从大括号之间的代码返回的内容必须是Observable<T>.

于 2020-12-11T19:31:48.423 回答