Javascript - 承诺内部承诺



有人可以帮我在承诺中做出承诺吗?代码是

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);
}
}

如您所见,我使用变量 refreshTokenService.wait 和 setInterval 定期检查值是否更改。但我认为最好的结局是承诺中的应许。

您可以将当前运行的承诺保留为类变量,并将其返回给所有其他客户端。 一旦承诺解决 - 将其设置为 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);

最新更新