【发布时间】:2017-12-21 21:09:00
【问题描述】:
我已经放置了一个角度路由 authguard 来放置我的页面。我有一个 api 可以检查令牌是否有效,并基于此我想返回 true 或 false 以进行进一步导航。
但似乎在“订阅”中,我将“结果”标志设置为 true,而不是在订阅之外持续存在。这里的“结果”变量是否在错误的范围内?我该如何纠正?请帮助我理解我在以下代码中的错误。
canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
const jwt = localStorage.getItem('jwt');
let result = false;
this.signinService.isSignedin(jwt).subscribe((res) => { // <---
console.log(res.json().message);
if (res.json().message === 'Token Valid') {
result = true;
console.log(result);
return true;
} else {
result = false;
return false;
}
}, (err) => { // <---
console.log(err);
result = false;
return false;
});
console.log('END' + result);
return result;}
上面的代码按以下顺序在控制台上打印出来,这对我来说似乎很奇怪。谁能解释一下?
END假
令牌有效
是的
【问题讨论】:
-
你不能。这就是该方法也可以返回 Promise 或 Observable 的原因:这些类型允许返回一个布尔值异步。如果这样做,路由器将订阅返回的 observable/promise,并在发出布尔偶数时导航(或不导航)。
-
嘿,任何答案对您有帮助吗? :)
-
是的,这让我明白我不能从和 api 调用返回布尔值。因此,正如我在下面的评论中所述,现在我决定在 jwt 存在时执行此操作并相应地返回布尔值。只有当用户发布时,我才会在服务器端验证令牌。
标签: angular subscribe auth-guard