【问题标题】:Variable get undefined value from return in response callback of http call变量在http调用的响应回调中从返回中获取未定义的值
【发布时间】:2021-01-28 19:53:09
【问题描述】:

我的服务中有这个函数可以很好地返回响应:

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

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

【问题讨论】:

  • 您正在对其中包含异步调用的方法进行同步调用。调用 this.authService.refreshToken();不会等待您的 observable 订阅返回值,因此它将返回 undefined。

标签: angular angular-httpclient angular-http-interceptors


【解决方案1】:

您可以做到这一点,让 promise 不订阅。

 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调用需要时间才能完成,换句话说它是异步调用

【讨论】:

    【解决方案2】:

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

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

    相反,您应该将 observable 返回给拦截器并在那里订阅。

    【讨论】:

      【解决方案3】:

      请写下来。

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

      因为 Service 总是返回一个 observable,你需要订阅它才能得到它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-09
        • 2016-01-05
        • 2020-06-29
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        相关资源
        最近更新 更多