我想这可能更像是一个rxjs理解主题,但上下文说明了我对它的最佳需求:)
在它下面是我的PageGuard类中的工作代码,它阻止路由到页面,除非localStorage中存在有效的jwt。
如果在localStorage中存在令牌,CheckForToken()只会附加授权标头。
public isAuthenticated():Observable<boolean>{
this.checkForToken();
let isAuth = new Observable<boolean>(observer => {
this.http.get(`https://testhan-api.selfbits.io/api/v1/user`,{headers: this.headers}).subscribe(res => {
if (res.status === 200){
observer.next(true);
observer.complete();
}else{
observer.next(false);
observer.complete()
}
},err => console.log(err));
});
return isAuth
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.isAuthenticated()
}
,路由路径如下所示
{
path:'dashboard',
component:DashboardComponent,
canActivate:PageGuard
}
我的问题:到目前为止,我的理解是你需要订阅一个observable,以便执行它,比如
observable.subscribe(res =&gt; //用res做某事)
但是在这里我只返回一个可观察的,它没有得到订阅,但是后卫如何评估呢?
感谢您的澄清!
答案 0 :(得分:3)
如果你真的想深入了解细节...这里有: - )
关于导航的大部分工作都采用runNavigate
方法。它到达警卫的地方是here,其中有一个checkGuards
的调用,它返回Observable<boolean>
。根据它的防护类型,它将为该类型的防护调用特定方法,该方法也返回Observable<boolean>
。所有这些“特定方法”都调用方法wrapIntoObservable
传递guard方法的结果。如果查看wrapIntoObservable
源代码,您将看到它检查Observable,Promise或常规值。在任何一种情况下,都会返回一个Observable。
现在回到调用堆栈,一旦所有的守护Observable都被合并到一个发出单个布尔值的Observable,那个observable就会经历resolving data for the routes的过程。如果合并的guard observable返回false,则新的解析Observable将返回一个Observable为false。否则,它将返回已解析数据的Observable。
在下一步中,解析Observable获取subscribed to with forEach
。如果已解析的数据为假(从警卫转发错误),则它将不返回任何内容并且路由停止。否则, anActivatedRoute
。从那里继续导航的其余部分。