【发布时间】:2019-03-24 23:25:49
【问题描述】:
我想延迟 observable 返回值,直到我从订阅中的 HTTP 请求中获得 new_token。我也在使用延迟时间,但我无法成功。
错误:返回未定义的值
预期:从服务器返回的 new_token
refreshToken(): Observable<string> {
const token_refreshed = localStorage.getItem("refresh_token");
let new_token: string;
if (token_refreshed) {
console.log("this refreshed token" + token_refreshed);
const headers = new HttpHeaders({
'Authorization': "Basic " + btoa("clientId:client-secret"),
'Content-Type': 'application/x-www-form-urlencoded',
'grant_type': 'refresh_token',
'refresh_token': token_refreshed
});
var creds = "grant_type=refresh_token" + "&credentials=true" + "&refresh_token=" + token_refreshed;
this.httplclient.post<UserToken>('/api/oauth/token', creds, { headers: headers })
.subscribe(response => {
localStorage.setItem('access_token', response.access_token);
new_token = response.access_token;
}, err => {
console.log("User authentication failed!");
});
}
console.log('i am returning');
return Observable.of(new_token).delay(3000);
}
更新:正在消耗 refresh_token 的方法,我正在使用拦截器,所以下面是 401 方法
handle401Error(req: HttpRequest<any>, next: HttpHandler) {
if (!this.isRefreshingToken) {
this.isRefreshingToken = true;
console.log('I am handler 401');
// Reset here so that the following requests wait until the token
// comes back from the refreshToken call.
this.tokenSubject.next(null);
return this.authService.refreshToken()
.switchMap((newToken: string) => {
console.log('map token' + newToken);
//I'm getting null new token here from authService.refreshToken()
if (newToken) {
this.tokenSubject.next(newToken);
return next.handle(this.addToken(req, newToken));
}
return this.logoutUser();
})
.catch(error => {
console.log('bad news its catch');
return this.logoutUser();
})
.finally(() => {
this.isRefreshingToken = false;
});
} else {
return this.tokenSubject
.filter(token => token != null)
.take(1)
.switchMap(token => {
console.log('i am switch map else ');
return next.handle(this.addToken(req, token));
});
}
}
【问题讨论】:
标签: angular rxjs observable angular5 angular-http-interceptors