等待可观察订阅 Angelar2
Await on observable subscription Angelar2
在我的 Angular2 应用程序中,我使用 canActivate 来允许访问页面。
其中一部分是与服务器核实令牌未被篡改,因此在我决定是否可以授予用户访问权限之前,我需要调用我的 api。
这意味着订阅一个 Observable 并等待一个答案。
我需要 return true 或 false,但由于我进行了 asyns 调用,因此我不能 return 根据我的回复。
我意识到我不能等待,因为它是单线程的,但我需要以某种方式阻止,直到我从 api 得到答复。
我的 canActivate 看起来如下:
canActivate() {
this.guardClient.checkToken("token")
.subscribe(response => {
let responseText = response.text().replace(/"/g, '');
if ( responseText === 'Ok')
{
return true;
}
if(responseText === 'denied') {
this.router.navigate(['login']); // redirecting to login
return false;
}
});
}
有人能告诉我如何解决这个问题吗??
在 angular 2 中查看 CanActivate 界面时,我看到以下内容:
export interface CanActivate {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean;
}
如您所见,您也可以 return 一个 Observable,而不仅仅是一个布尔值。
这意味着您的代码可以像这样重写。
canActivate() {
return this.guardClient.checkToken("token")
.map(response => {
let responseText = response.text().replace(/"/g, '');
if ( responseText === ' Ok')
{
return true;
}
if(responseText === 'denied') {
this.router.navigate(['login']); // redirecting to login
return false;
}
});
}
这将使 Angular 在决定是否可以显示路线之前等待 observable 解决。
请注意,此方法应该非常快以避免加载缓慢。
在我的 Angular2 应用程序中,我使用 canActivate 来允许访问页面。 其中一部分是与服务器核实令牌未被篡改,因此在我决定是否可以授予用户访问权限之前,我需要调用我的 api。 这意味着订阅一个 Observable 并等待一个答案。
我需要 return true 或 false,但由于我进行了 asyns 调用,因此我不能 return 根据我的回复。 我意识到我不能等待,因为它是单线程的,但我需要以某种方式阻止,直到我从 api 得到答复。 我的 canActivate 看起来如下:
canActivate() {
this.guardClient.checkToken("token")
.subscribe(response => {
let responseText = response.text().replace(/"/g, '');
if ( responseText === 'Ok')
{
return true;
}
if(responseText === 'denied') {
this.router.navigate(['login']); // redirecting to login
return false;
}
});
}
有人能告诉我如何解决这个问题吗??
在 angular 2 中查看 CanActivate 界面时,我看到以下内容:
export interface CanActivate {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean;
}
如您所见,您也可以 return 一个 Observable,而不仅仅是一个布尔值。 这意味着您的代码可以像这样重写。
canActivate() {
return this.guardClient.checkToken("token")
.map(response => {
let responseText = response.text().replace(/"/g, '');
if ( responseText === ' Ok')
{
return true;
}
if(responseText === 'denied') {
this.router.navigate(['login']); // redirecting to login
return false;
}
});
}
这将使 Angular 在决定是否可以显示路线之前等待 observable 解决。 请注意,此方法应该非常快以避免加载缓慢。