3 回答
TA贡献1805条经验 获得超10个赞
你不应该依赖它是同步的,因为它可能是现在,但不是明天。
根据接口,您可以轻松返回 anObservable<boolean>或 a Promise<boolean>,因为 Angular 支持。
export class AuthenticatedGuard implements CanActivate {
constructor( private router: Router ) { }
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return Auth.isSignedIn().pipe(map(isAlreadyLoggedIn => {
if (isAlreadyLoggedIn) {
this.router.navigate(['/home']);
return false;
}
return true;
}));
}
}
TA贡献1943条经验 获得超7个赞
你可以只返回一个Observable<boolean>:
return Auth.isSignedIn().pipe(map(yes=>{
if (yes) {
this.router.navigate(['/home']);
return false;
} else {
return true;
}
}));
您还可以使用Promise返回类型,为此创建您的函数async并使用 await 将Observablea转换为Promise:
async canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Promise<boolean> {
const yes = await Auth.isSignedIn().toPromise();
if (yes) {
this.router.navigate(['/home']);
return false;
}
return true;
}
一个async函数只能返回一个Promise.
TA贡献1824条经验 获得超6个赞
您可以将激活器简化为如下所示:
return Auth.isSignedIn().pipe(
tap(yes => yes && this.router.navigate(['/home'])),
mapTo(true)
);
当您无法直接看到它的创建时,您应该始终假设observable 是异步的。如果Auth.isSignedIn()是由第三方图书馆发布的,你会怎么做?
添加回答
举报