angular5中HttpClient拦截器catchError调用函数的this指向谁?

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const token = AuthStorage.getItem('mano');
    const token_snap = AuthStorage.getItem('mano_snap');
    req = req.clone({
      setHeaders: {
        'APIKEY': '33726880C9CE84E67A5C27BD4A2CE91AD2',
        'token': token ? token : token_snap || 'mano'
      }
    });
    return next.handle(req).pipe(
      catchError(this.handleError)
    );
  }
  handleError(error: HttpErrorResponse) {
    console.log(this);    // 此时的this指向
    const code = error['status'];
    if (code === 401 || code === 417) {
      Auth.loginOut();
    }
    const err = {url: error['url'], status: error['status'], msg: error['error'].msg};
    return new ErrorObservable(err);
  }

在handleError方法中怎么调用其它方法呢?

阅读 6.2k
3 个回答

指向调用者,非此 class。
如果要指向此 class ,请使用箭头函数

    return next.handle(req).pipe(
      catchError((err) => this.handleError(err))
    );

你在intercept最后不是调用了this.handleError么,这个this和handleError方法里面的this就是同一个吧,都是指向当前class对象。你在class里面定义的方法都可以直接用this调用。
或者注入服务以后通过this.xxxService.xxx()调用

你这么写是指向调用者,如果要绑定this,请使用arrow function或者bind。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进