通常这种问题是由于在路由守卫中使用了异步操作(例如 observable 或 promise),并且忘记了在某个时间点解决它们,从而导致陷入了循环。
解决该问题的一种方法是使用 canActivate()
方法中返回的 observable,这样可以在处理完所有异步操作后返回结果。例如,对于一个返回 observable 的 guard,可以在解决它之前添加 take(1)
来确保它只执行一次:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {
return this.userService.isAuthenticated.pipe(
take(1),
map(isAuth => {
if (isAuth) {
return true;
} else {
// Redirect to login page
this.router.navigate(['login']);
return false;
}
})
);
}
通过使用 take(1)
,我们可以在处理完第一个值后,立即完成管道,防止陷入无限循环。