我有两个警卫,Guard1 和 Guard2。Guard1 返回一个 Observable,Guard2 返回布尔值。
canActivate:[Guard1,Guard2]
假设Guard2会返回false,Guard1的请求会自动取消吗?还是无论如何都会执行呼叫?
我有两个警卫,Guard1 和 Guard2。Guard1 返回一个 Observable,Guard2 返回布尔值。
canActivate:[Guard1,Guard2]
假设Guard2会返回false,Guard1的请求会自动取消吗?还是无论如何都会执行呼叫?
Guard1 的请求将被取消,而 Guard2 对此负有责任。我将它与if
你将条件&&
与, 大多数时候)。如果任何条件/Guard 返回false
的整体结果是false
,则如果其中一个已经返回,则无需评估/等待任何其他条件/Guard false
,因此将取消正在运行的请求。
有一些方法可以实际控制这一点,如果您依赖所有 Guard(从 Guard 发出的请求)执行直到它们全部完成 - 但他们所做的不仅仅是保护路线,请记住这一点。当我遇到这种行为时,我将使用我的情况更详细地解释这一点:
我创建了一个简单的 HTTP 缓存来保持较低的请求数量。我只在一个 Guard 中触发了一个请求,但该请求从未完成,因为其他 Guard 更早返回 false 并且请求被取消。这个请求从来没有被缓存,因为我没有得到任何结果,因为请求总是被取消(简化版本听起来没用,但它说明了我想说的话)。然后我这样做了:
像这样:
const wrapperSubject = new Subject<boolean>();
this.http.get(apiUrl, this.reqOptions)
.map(res => {
// extract data from result ...
// add to cache ...
return booleanGuardResult;
})
.takeUntil(wrapperSubject)
.subscribe(booleanGuardResult=> {
wrapperSubject.next(booleanGuardResult);
wrapperSubject.complete();
});
return = wrapperSubject.asObservable();
这适用于我的情况,请求被缓存。
如果您依赖于异步 Guard 执行的顺序,我可以想象创建一个简单的 Guard 来处理这个问题,组合多个其他 Guard 以按定义的顺序执行(使用 RxJS combineLatest 和/或类似的运算符.有很多,取决于你想要达到什么......)。如果所有 Guard 都返回布尔值而不是 Observable 或 Promise,则 Guard 执行的顺序是在路由中定义的——我无法想象 Angular 会改变执行顺序。