我有两个卫队,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
声明进行了比较,在声明中将条件与&&
结合起来,除了未定义Guards的执行次序/结果(由于一些Guards可能是异步并且有些不是 - 并且您希望它们运行平行,大部分时间)。如果任何条件/ Guard返回false
,则总体结果为false
,如果其中一个已返回false
,则不需要评估/等待任何其他条件/ Guard,因此正在运行的请求将被取消。
如果你依赖所有的守卫(从守卫发射的请求)执行直到他们全部完成 - 但是这样做不仅仅是守护路线,还有其他方法可以实际控制这种情况。当我遇到这种情况时,我会更详细地解释这一点:
我创建了一个简单的HTTP缓存,以将请求数保持为低。我有一个请求只在一个卫队内被解雇,但是这个请求从未完成,因为其他卫兵先前返回了错误,并且请求被取消了。这个请求从来没有被缓存,因为我没有得到任何结果,因为请求总是被取消(简化版本听起来毫无用处,但它证明了我想说的话)。然后,我这样做:
这样的:
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和/或类似的运营商,有很多,取决于你想达到什么...)。如果所有的守卫都返回boolean而不是Observable或Promise,Guard执行的顺序就是在路由中定义的顺序 - 我无法想象Angular会改变执行顺序。
它取决于调用的顺序 –
我认为Guard1是先执行的,但它是异步的。然后Guard2是错误的。我可以在开发人员工具中看到xhr请求被取消,但我不知道为什么。 –
你是在告诉警卫异步呼叫被取消了吗? –