Angular - используйте сервис в функции, а эту функцию в трубе. - PullRequest
0 голосов
/ 13 декабря 2018

Как написано выше, я хочу использовать Сервис, который внедряется в root, в функцию для выхода пользователя из системы после ошибки 401.Функция вызывается в канале после ошибки в одном из моих http-запросов.К сожалению, я получаю сообщение об ошибке:
ОШИБКА TypeError: Невозможно прочитать свойство 'logout' из неопределенного
после ошибки 401.Кажется, что функция вызывается в другом объеме.Я пытался внедрить Сервис через injector.get, чтобы установить мой сервис и функцию ошибки на public, но ничего не получалось.
Есть ли другая возможность исправить это?

constructor(private httpClient: HttpClient, private authenticationService: AuthenticationService) {}

private handleError(error: HttpErrorResponse) {
  if (error.status === 401) {
    this.authenticationService.logout();
  }
  return throwError('Something bad happened; please try again later.');
}

getSomething(): Observable<HttpResponse<Model>> {
  return this.httpClient.get<Model>(this.apiEndpoint, {
    observe: 'response'
  }).pipe(
  catchError(this.handleError)
  );
}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Это проблема контекста this.Либо вы можете использовать функцию жирной стрелки или функцию связывания handleError с контекстом службы.

getSomething(): Observable<HttpResponse<Model>> {
  return this.httpClient.get<Model>(this.apiEndpoint, {
    observe: 'response'
  }).pipe(
  catchError(this.handleError.bind(this))
  );
}
0 голосов
/ 13 декабря 2018

Без рабочего примера немного сложно устранить неполадки, но я предполагаю, что поскольку вы передаете функцию напрямую, функция не будет выполняться в контексте this вашего класса / компонента, и, следовательно, служба, вероятно, не определена.,«Жирная стрелка», скорее всего, решит эту проблему.

Измените ваш код следующим образом:

getSomething(): Observable<HttpResponse<Model>> {
  return this.httpClient.get<Model>(this.apiEndpoint, {
    observe: 'response'
  }).pipe(
  catchError(err => this.handleError)
  );
}

Посмотрите этот пост для получения дополнительной информации.

...