变量在 http 调用的响应回调中从 return 中获取未定义的值

Variable get undefined value from return in response callback of http call

我的服务中有这个功能,returns 很好的回应:

public refreshToken(): string {
    const token_refresh = localStorage.getItem('token_refresh');
    this.http.post<any>(environment.baseApiUrl + 'token_refresh', {token_refresh}, this.requestOptions).subscribe(
      response => {
        localStorage.setItem('token', response.token);
        return response.token;
      }
    );
  }

并且在 http 拦截器中我想获得返回的 response.token :

 token = this.authService.refreshToken();

但是我得到的不是令牌值,而是 undefined

我想这可能与异步行为有关,但我找不到如何获得正确的返回值。

这不是 http with observables 的工作方式。

由于 oberservables 的异步特性,拦截器不会等到 http 请求完成。

相反,您应该 return 可观察到拦截器并在那里订阅。

请写这个。

 token = this.authService.refreshToken().subscribe(tokenComingFromService=>{
 console.log(tokenComingFromService);
 })

因为服务总是 returns 您需要订阅才能获得的可观察对象。

你可以做到这一点 承诺 不订阅。

 public refreshToken(): string {
    const token_refresh = localStorage.getItem('token_refresh');
    return this.http.post<any>(environment.baseApiUrl + 'token_refresh', {token_refresh}, this.requestOptions).toPromise();
  
  }

在另一边

 this.authService.refreshToken.then(response =>{
    token = response.token
    localStorage.setItem('token', response.token);
  });

或 使用 observable 试试这个

public refreshToken(): string {
  const token_refresh = localStorage.getItem('token_refresh');
  return this.http.post<any>(environment.baseApiUrl + 'token_refresh', {token_refresh}, this.requestOptions)
}

在拦截器中

token = this.authService.refreshToken().subscribe(
  response => {
    localStorage.setItem('token', response.token);
     response.token;
  }
);

这是因为 http 调用需要时间才能完成,换句话说它是异步调用