如果尚未加载活动成员,我有一个防止用户进入路由的防护。有时,活动成员被缓存,守卫立即返回true。当观察者立即发出真实警卫不起作用时,好像它从未收到所发出的“真实”。如果我添加一个settimeout,一切都按预期工作。警卫为什么不像我期望的那样工作?
作品
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
this.store.select(getActiveMember).pipe(filter(member => member != null), take(1)).subscribe(member => {
setTimeout(() => {
this.subject.next(true);
}, 1000);
})
return this.subject;
}
不能工作
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
this.store.select(getActiveMember).pipe(filter(member => member != null), take(1)).subscribe(member => {
this.subject.next(true);
})
return this.subject;
}
答案 0 :(得分:3)
您在这里错误地使用了observable。这里的返回可能会在调用this.subject.next之前或之后触发,你无法知道这种或那种方式。只需直接返回observable,如果活动成员不为null,则将Observable解析为true。 Marv给出的代码可以做到这一点,但也只是:
$query = "INSERT INTO tbl_post(cat,titile,body,author,tags) VALUES('$cat','$titile','$body','$author','$tags')";