[英]Javascript - Promise inside promise
Could somebody help me make a promise inside the promise? 有人可以帮助我在承诺中做出承诺吗? The code is 该代码是
function getAccessToken(http: Http, router: Router, refreshTokenService: RefreshTokenService): Promise<string> {
let jwtHelper: JwtHelper = new JwtHelper();
let accessToken = localStorage.getItem('JWToken');
if (accessToken == '' || !accessToken || accessToken == undefined || accessToken == null) {
router.navigate(['./admin/login']);
return;
}
if (jwtHelper.isTokenExpired(accessToken)) {
let waitPeriod = (!refreshTokenService.wait);
refreshTokenService.wait = true;
return new Promise((resolve, reject) => {
if (waitPeriod) {
refreshTokenService.refreshToken(accessToken).subscribe((res: any) => {
res = res.json();
if (res.token) {
localStorage.setItem('JWToken', res.token);
resolve(res.token);
refreshTokenService.wait = false;
} else {
localStorage.removeItem('JWToken');
router.navigate(['./admin/login']);
}
});
} else {
let interval = setInterval(function () {
if(refreshTokenService.wait == false) {
resolve(localStorage.getItem('JWToken'));
clearInterval(interval);
}
}, 500);
}
});
} else {
return Promise.resolve(accessToken);
}
}
As you can see, i use a variable refreshTokenService.wait and a setInterval to check periodicaly if the value is changed. 如您所见,我使用变量refreshTokenService.wait和setInterval定期检查值是否更改。 But i think the best aproach will be a Promise inside the promise. 但是我认为最好的办法是在诺言中承诺。
You can just keep the current running promise as a class variable and return it to all other clients. 您可以仅将当前运行的Promise保留为类变量,然后将其返回给所有其他客户端。 as soon as promise resolved - set it to null. 诺言一旦解决-将其设置为null。
class Test {
getData() {
if(!this.request) {
this.request = new Promise((res)=> {
console.log('start request')
setTimeout(()=>res('token' + new Date()), 1000);
}).then(token=> {
this.request = null;
return token;
});
}
return this.request;
}
}
let t = new Test();
// all these clients get the same result
t.getData().then(x=>console.log(x));
t.getData().then(x=>console.log(x));
t.getData().then(x=>console.log(x));
// all these clients get the another result
setTimeout(()=> {
t.getData().then(x=>console.log(x));
t.getData().then(x=>console.log(x));
t.getData().then(x=>console.log(x));
}, 3000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.