我的服务中有一个方法,它从存储中读取令牌并返回一个promise。
getToken() {
return this.storage.get('access_token');
}
(storage.get返回一个承诺)
我需要修改上面的方法,以便它首先从存储中读取访问令牌并检查其到期时间,如果它未过期则立即返回,如果它已过期从存储读取refresh_token,即this.storage.get('refresh_token' )它再次返回一个promise,在检查它是否未过期后,我需要使用Angular 2 http.post向我的api发出http请求,这将返回一个新的访问令牌。一旦收到新的访问令牌,getToken函数就会返回。
我虽然下面会有效,但它不会:
getToken() {
var promise = new Promise(function (resolve, reject) {
this.storage.get('access_token').then((accessToken) => {
//check if the token is expired
if (accessToken) {
if (!this.isExpired(accessToken)) {
resolve(accessToken);
}
else {
this.storage.get('refresh_token').then((refreshToken) => {
if (!this.isExpired(refreshToken)) {
this.http.post('/api/refresh/', { token:refreshToken })
.subscribe((data) => {
resolve(data);
});
}
else {
resolve(null);
}
});
}
} else {
resolve(null);
}
});
});
return promise;
}
任何人都可以指导,如何实现这一目标?
答案 0 :(得分:2)
我打赌你在回传function
中have the wrong this
传递给new Promise
构造函数。
您也可以在那里使用箭头功能,或者只需avoid the promise construction antipattern并完全删除它:
getToken() {
return this.storage.get('access_token').then(accessToken => {
if (!accessToken)
return null;
else if (!this.isExpired(accessToken))
return accessToken;
else
return this.storage.get('refresh_token').then(refreshToken => {
if (this.isExpired(refreshToken))
return null;
else
return promiseFromObservable(this.http.post('/api/refresh/', { token:refreshToken }));
});
});
}
function promiseFromObservable(o) {
return new Promise(resolve => o.subscribe(resolve));
}