角度守卫只能在延迟

时间:2018-04-17 17:35:56

标签: angular ngrx

如果尚未加载活动成员,我有一个防止用户进入路由的防护。有时,活动成员被缓存,守卫立即返回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;
}

1 个答案:

答案 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')";