如何解决RXJS如何处理switchmap中返回的布尔值或Observable <boolean>
在上下文中,我在一个有角度的路线上有两个警卫,但是由于有一个副作用以及所有警卫都在一条路线上受到检查的事实,我不能在canCanate路线上同时使用它们。
要解决此问题,我有一个护卫在特定情况下呼叫其他人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<boolean> | Promise<boolean> | 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映射的上下文中做到这一点。
解决方法
您可以使用isObservable
和isPromise
来检查结果是可观察的还是可实现的。如果没有,请用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)
})
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。