守卫可以用同步的方式返回一个布尔值。但在很多情况下,守卫无法用同步的方式给出答案。 守卫可能会向用户问一个问题、把更改保存到服务器,或者获取新数据,而这些都是异步操作。因此,路由的守卫可以返回一个Observable<boolean>或Promise<boolean>,并且路由器会等待这个可观察对象被解析为true或false。
canActivate(): Promise<boolean> {
return this.http.post('url', null).toPromise().then(
res => {
if (res) {
return true;
} else {
return false;
}
}
);
}