CanLoad,Lazy模块和take(1)

时间:2018-12-04 13:00:32

标签: angular lazy-loading

我正在使用CanLoad通过Guard保护惰性模块。

我正在恢复ngrx存储的状态,并检查用户是否已通过身份验证。

这是我的auth-guard.service.ts中的代码:

canLoad() {
    return this.store.pipe(
        select('auth'),
        take(1),
        map(
            (authState: fromAuth.State) => {
                if (authState.authenticated) {
                    return true;
                } else {
                    this.router.navigate(['/auth/signin']);
                    return false;
                }
            }
        ))
}

此代码正常。所有工作都按预期进行。

但是问题是...为什么我需要使用take(1)才能使它起作用?如果我取走take(1),则此后卫无法正常工作。

1 个答案:

答案 0 :(得分:1)

它只能与take(1)一起使用,因为此时没有可观察的对象将不会完成,并且canLoad会等到可观察的对象完成。

请参阅http://reactivex.io/documentation/operators/take.html,汇整将从源头构建一个新的可观察汇整x个项目,完成后将忽略其他项目。