2017-05-14 4 views
0

누군가 약속대로 할 수 있습니까? 코드는 당신이 볼 수 있듯이, 내가 값이 변경되는 경우를 정기적으로 다시 확인하는 변수 refreshTokenService.wait과 setInterval을을 사용자바 스크립트 - 약속 내부 약속

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

입니다. 하지만 최선의 약속은 약속 안에서 약속이라고 생각합니다.

답변

0

현재 실행중인 약속을 클래스 변수로 유지하고 다른 모든 클라이언트에게 반환 할 수 있습니다. 약속이 해결되면 즉시 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); 
관련 문제