【问题标题】:RXJS how to handle returned boolean or Observable<boolean> in switchmapRXJS 如何在 switchmap 中处理返回的布尔值或 Observable<boolean>
【发布时间】:2020-12-21 02:40:09
【问题描述】:

对于上下文,我有两个守卫在一个有角度的路线上,但我不能让他们都在路线上 canActivate 由于一个副作用以及所有守卫都在一条路线上被检查的事实。

因此,为了解决问题,我有一个守卫在某些情况下调用其他守卫 canActivate:

canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot
    ): Observable<boolean> | Promise<boolean> | boolean {
        return this.service.state$.pipe(
            filter((s) => s.updatedFromServer),
            switchMap((s) => {
                if (/* a condition that means this guard is satisfied */) {
                    return this.otherGuard.canActivate(next, state);
                } else {
                    return false;
                }
            })
        );

另一个守卫的 canActivate 返回类型也是 Observable&lt;boolean&gt; | Promise&lt;boolean&gt; | boolean 并且同样可以返回一个实际的布尔值或 Observable。

TS 错误投诉现在是:

Type 'false | Observable<boolean>' is not assignable to type 'ObservableInput<any>'.
Type 'false' is not assignable to type 'ObservableInput<any>'

如果另一个守卫只返回一个 Observable 并且这里的 switchmap 返回也更改为of(false) 那么它似乎没问题,但我更愿意保留可以返回解析布尔值的 canActivate 签名 - 我只是不知道如何在 rxjs 映射的上下文中做到这一点。

【问题讨论】:

  • 这个of(false)不能返回是什么原因?
  • switchMap 操作符总是返回一个 observable。所以你需要返回(假)。我不太明白为什么你不能返回一个可观察的布尔值?请您详细说明一下。
  • 我可以在这个守卫中回复 of(false),但是另一个守卫在其他地方独立使用,我不想改变它。如果没有更好的方法,我可以 - 只是认为可能有一个 rxjs 运算符可以让我合并布尔值和 Observable 的混合。但是好像没有
  • 返回 of(false) 并没有破坏 canActivate 签名。 xxxMap 运算符确实要求您返回一个可观察对象。通过不返回可观察对象,您正在破坏 switchMap 合同本身。您不能在服务本身中包含条件,以便可观察对象可以返回真/假吗?

标签: angular rxjs


【解决方案1】:

您可以使用isObservableisPromise 检查结果是 Observable 还是 Promise。如果不使用of 包装值。

import { isObservable } from 'rxjs';
import { isPromise } from 'rxjs/internal-compatibility';

return this.service.state$.pipe(
  filter((s) => s.updatedFromServer),
  switchMap((s) => {
    let result: any;
    if (/* a condition that means this guard is satisfied */) {
      result = this.otherGuard.canActivate(next, state);
    } else {
      result = false;
    }
    return isObservable(result) || isPromise(result) ? result : of(result)
  })
);

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 2016-12-18
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多