【问题标题】:Angular - use a service in a function and this function in a pipeAngular - 在函数中使用服务并在管道中使用此函数
【发布时间】:2018-12-13 08:35:07
【问题描述】:

如上所述,我想在一个函数中使用注入到根目录中的服务,以便在 401 错误后注销用户。在我的一个 http 请求中发生错误后,该函数在管道中被调用。不幸的是,我收到如下错误:
错误类型错误:无法读取未定义的属性“注销”
401错误后。似乎该函数是在不同的范围内调用的。我尝试通过 injector.get 注入服务,将我的服务和错误功能设置为公开,但没有任何效果。
还有其他机会解决这个问题吗?

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)
  );
}

【问题讨论】:

    标签: angular service scope pipe angular6


    【解决方案1】:

    这是一个this 上下文问题。您可以使用胖箭头函数或将 handleError 函数与服务上下文绑定。

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

    【讨论】:

      【解决方案2】:

      如果没有工作示例,故障排除有点困难,但我假设由于您直接传递函数,因此该函数不会在您的类/组件的 this 上下文中执行,因此服务可能未定义. “胖箭头函数”很可能会解决这个问题。

      像这样更改您的代码:

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

      查看this post 了解更多信息。

      【讨论】:

      • 不幸的是它不起作用:'(err: any) => (error: HttpErrorResponse) => Observable' 类型的参数不能分配给'(err: any, 捕获的类型的参数: Observable) => ObservableInput' 我会尝试在 stackblitz 上构建它
      猜你喜欢
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      相关资源
      最近更新 更多