1

我有两个卫队,Guard1和Guard2。 Guard1返回一个Observable,Guard2返回布尔值。多个卫兵调用异步功能

canActivate:[GUARD1,GUARD2]

假设GUARD2将返回false,是从GUARD1请求自动取消?或者电话会被执行呢?

+0

它取决于调用的顺序 –

+0

我认为Guard1是先执行的,但它是异步的。然后Guard2是错误的。我可以在开发人员工具中看到xhr请求被取消,但我不知道为什么。 –

+0

你是在告诉警卫异步呼叫被取消了吗? –

回答

1

Guard1的请求将被取消,Guard2对此负责。我将它与if声明进行了比较,在声明中将条件与&&结合起来,除了未定义Guards的执行次序/结果(由于一些Guards可能是异步并且有些不是 - 并且您希望它们运行平行,大部分时间)。如果任何条件/ Guard返回false,则总体结果为false,如果其中一个已返回false,则不需要评估/等待任何其他条件/ Guard,因此正在运行的请求将被取消。

如果你依赖所有的守卫(从守卫发射的请求)执行直到他们全部完成 - 但是这样做不仅仅是守护路线,还有其他方法可以实际控制这种情况。当我遇到这种情况时,我会更详细地解释这一点:

我创建了一个简单的HTTP缓存,以将请求数保持为低。我有一个请求只在一个卫队内被解雇,但是这个请求从未完成,因为其他卫兵先前返回了错误,并且请求被取消了。这个请求从来没有被缓存,因为我没有得到任何结果,因为请求总是被取消(简化版本听起来毫无用处,但它证明了我想说的话)。然后,我这样做:

  • 我创建了一个“包装”可观察的卫队returnes作为他的结果是
  • 这种“包装”可观察只是传递请求的结果(第二可观察)回来,作为结果卫兵
  • 角只会“取消”返回“包装”可观的,因此请求将完成,即使“包装”可观察将被取消

这样的:

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会改变执行顺序。