2017-05-14 2 views
0

Konnte jemand mir helfen, ein Versprechen innerhalb des Versprechens zu machen? Der Code istJavascript - Versprechung innerhalb des Versprechens

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

Wie Sie sehen können, verwende ich eine Variable refreshTokenService.wait und setInterval periodisch zu überprüfen, ob der Wert geändert wird. Aber ich denke, der beste Ansatz wird eine Verheißung innerhalb des Versprechens sein.

Antwort

0

Sie können das aktuelle laufende Versprechen einfach als Klassenvariable behalten und es an alle anderen Clients zurückgeben. sobald das Versprechen aufgelöst wurde - setze es auf 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); 
Verwandte Themen