Angular 角度保护仅在延迟后工作

Angular 角度保护仅在延迟后工作,angular,ngrx,Angular,Ngrx,我有一个防护装置,它可以防止用户在活动成员尚未加载时进入路由。有时,活动成员会被缓存,防护会立即返回true。当可观察对象立即发出“真”时,防护装置不工作,好像它从未收到发出的“真”。如果我添加一个settimeout,一切都会按预期进行。为什么警卫没有像我期望的那样工作 有效 canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { this.s

我有一个防护装置,它可以防止用户在活动成员尚未加载时进入路由。有时,活动成员会被缓存,防护会立即返回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(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察{
this.store.select(getActiveMember).pipe(filter(member=>member!=null),take(1)).subscribe(member=>{
设置超时(()=>{
this.subject.next(true);
}, 1000);
})
返回此.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;
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察{
this.store.select(getActiveMember).pipe(filter(member=>member!=null),take(1)).subscribe(member=>{
this.subject.next(true);
})
返回此.subject;
}

您在此处使用的观测值不正确。此处的返回可能在调用this.subject.next之前或之后触发,而您无法知道其中一种方式。只要直接返回可观测值,如果活动成员不为null,则将可观测值解析为true。Marv给出的代码可以做到这一点,但也只是:

return this.store.select(getActiveMember)
    .map((member) => { return member != null && member != undefined})

您在这里使用的观测值不正确。此处的返回可能在调用this.subject.next之前或之后触发,而您无法知道其中一种方式。只要直接返回可观测值,如果活动成员不为null,则将可观测值解析为true。Marv给出的代码可以做到这一点,但也只是:

return this.store.select(getActiveMember)
    .map((member) => { return member != null && member != undefined})

你为什么要用另一个科目?我只想返回
this.store.select(getActiveMember).pipe(filter(member=>member!=null)、take(1)、mapTo(true))
此外,在某些情况下,您可能还想发出
false
您的答案似乎确实有效,我不知道为什么使用额外的主题会使其表现出任何不同。如果你想回答这个问题,我会接受的。你为什么要用另一个话题?我只想返回
this.store.select(getActiveMember).pipe(filter(member=>member!=null)、take(1)、mapTo(true))
此外,在某些情况下,您可能还想发出
false
您的答案似乎确实有效,我不知道为什么使用额外的主题会使其表现出任何不同。如果你想回答这个问题,我会接受的。