变量在 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 调用需要时间才能完成,换句话说它是异步调用
我的服务中有这个功能,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 调用需要时间才能完成,换句话说它是异步调用