2017-05-14 29 views
0

誰かが約束の中で約束をするのを助けることができますか?コードは、あなたが見ることができるように、私は値が変更された場合periodicalyチェックする変数refreshTokenService.waitとのsetIntervalを使用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); 
} 
} 

です。しかし、私は最高のaproachは約束の中に約束と思う。

答えて

0

現在実行中の約束をクラス変数として保持し、他のすべてのクライアントに返すことができます。約束が決まるとすぐに - それをヌルにしてください。

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