如何在映射时将 angular observable 编码为 return 平面值

How do to code an angular observable to return flat values when mapped

我正在编写代码,如果某个值设置为 true,则不允许客户访问页面我现在有可用的代码,但我的直觉告诉我这不是最有效的使用方式。

密码是:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    let bar= false;
    this.foo$.subscribe((x) => {
        bar = x;
    });

    return !bar;
}

但我希望它看起来像这样:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.foo$.subscribe((x) => {
        return x;
    });
}

问题是如果我这样使用它,它会一直返回一个 Observable,而守卫的 canActivate 函数在这个 Observable 上不起作用。

如果 this.foo$ 是一个 Observable<boolean> 那么你可以简单地否定 map() 函数中的布尔值 (see documentation) 和 return 结果 Observable 像这样:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.foo$.map(x => !x);
}

由于异步 foo$ 订阅,您的第一个代码片段将无法可靠地工作。在调用 foo$.subscribe() 方法之前,函数可能总是 return true