Элементарная проблема углового синтаксиса с объявлением обработчика ошибок в сервисе - PullRequest
0 голосов
/ 07 февраля 2019

Проходя учебник по Angular и конвертируя его в свои цели, я решил, что хочу объединить 2 варианта метода обработчика ошибок, показанные в одном, потому что мне нравится функция обоих.

Это все в одной службе, и это 2 метода из учебника:

  private handleError1(error: HttpErrorResponse) {
    if (error.error instanceof ErrorEvent) {
      console.error('An error occurred', error.error.message);
    } else {
      console.error(`Backend error code ${error.status}`, 
        `body: ${error.error}`);
    }
    return throwError('Something bad happened');
  }

, который вызывается так, где Group - мой класс с сервера REST:

  getGroups(): Observable<Group[]> {
    return this.httpClient.get<Group[]>(`${this.restUrl}/group`).pipe(
        tap(_ => this.log(`fetched groups`)),
        catchError(this.handleError1)
      );
  }

, а затем, альтернативно, есть:

  private handleError2<T>(operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {
      console.error(`${operation} failed!`, error);
      return of(result as T);
    }
  }

, который называется так:

  getGroups(): Observable<Group[]> {
    return this.httpClient.get<Group[]>(`${this.restUrl}/group`).pipe(
        tap(_ => this.log(`fetched groups`)),
        catchError(this.handleError2<Group[]>('getGroups', []))
      );
  }

Итак, я наивно собрал свой обработчик ошибок комбинации:

private handleError<T>(error: HttpErrorResponse, 
                   operation = 'operation', result?: T) {
....

, но у меня проблемы, потому что я не могу понять, как его параметризировать в catchError().Что HttpErrorResponse явно подразумевается как-то, когда это единственный параметр, но как?

1 Ответ

0 голосов
/ 07 февраля 2019

Я потратил немного больше времени на это.

Во-первых, я позаботился о том, чтобы у меня была последняя версия TypeScript.Мой проект использует 3.1.1.

Это мой метод:

  getProducts(): Observable<Product[]> {
    return this.http.get<Product[]>(this.productUrl).pipe(
      tap(data => console.log('All: ' + JSON.stringify(data))),
      catchError(error => this.handleError<Product[]>(error, 'get', [] ))
    );
  }

Это мой обработчик ошибок:

  private handleError<T>(err: HttpErrorResponse, operation = 'operation', result?: T) {
    // in a real world app, we may send the server to some remote logging infrastructure
    // instead of just logging it to the console
    let errorMessage = '';
    if (err.error instanceof ErrorEvent) {
      // A client-side or network error occurred. Handle it accordingly.
      errorMessage = `An error occurred: ${err.error.message}`;
    } else {
      // The backend returned an unsuccessful response code.
      // The response body may contain clues as to what went wrong,
      errorMessage = `Server returned code: ${err.status}, error message is: ${err.message}`;
    }
    console.error(errorMessage);
    return throwError(errorMessage);
  }

Я не получаю никакой компиляцииошибки с этим кодом.

Я даже включил строгий режим в моем файле tsconfig.json:

"strict": true,

И он все еще скомпилирован без синтаксических ошибок.

Я создал стек стеказдесь: https://stackblitz.com/edit/angular-simple-retrieve-deborahk

Дайте мне знать, если вы не видите тот же результат.

...