首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript - Promise中的promise

Javascript - Promise中的promise
EN

Stack Overflow用户
提问于 2017-05-15 05:03:16
回答 1查看 386关注 0票数 0

有没有人能帮我在诺言里许个愿?代码是

代码语言: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来定期检查该值是否发生了变化。但我认为最好的方法是在诺言中加入诺言。

EN

回答 1

Stack Overflow用户

发布于 2017-05-15 06:20:09

您只需将当前运行的promise作为类变量并将其返回给所有其他客户端即可。一旦promise解析-将其设置为null。

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43968770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档