多个 Guards 调用异步函数
Multiple Guards calling async function
我有两个守卫,Guard1 和 Guard2。
Guard1 return 是一个 Observable,Guard2 return 是一个布尔值。
可以激活:[Guard1, Guard2]
假设Guard2会returnfalse,Guard1的请求是不是自动取消了?还是无论如何都会执行调用?
Guard1 的请求将被取消,Guard2 对此负责。我将它与 if
语句进行比较,在该语句中,您将条件与 &&
组合在一起,除了在 Guards 的情况下 execution/result 的顺序未定义(由于某些 Guards 可能是异步的有些不是 - 大多数时候你希望它们并行运行)。如果任何 condition/Guard returns false
总体结果是 false
,则不需要 evaluate/wait 任何其他 condition/Guard 如果其中之一已经 returned false
,因此 运行ning 请求将被取消。
如果您依赖于所有守卫(从守卫发出的请求)执行直到它们全部完成,则有一些方法可以实际控制它 - 但他们所做的不仅仅是守卫一条路线,请记住这一点。当我 运行 进入这种行为时,我将根据我的情况更详细地解释这一点:
我创建了一个简单的 HTTP 缓存来保持较低的请求数。我有一个请求只在一个 Guard 中被触发,但该请求从未完成,因为其他 Guards return 早些时候输入了 false 并且请求被取消了。这个请求从来没有被缓存,因为我没有得到任何结果,因为请求总是被取消(简化版本听起来没用,但它证明了我想说的)。然后我这样做了:
- 我创建了一个 "wrapper" Observable,Guard returnes 作为他的结果
- 这个 "wrapper" Observable 只是将请求的结果(第二个 Observable)传回,作为 Guard
的结果
- Angular 只会 "cancel" returned "wrapper" Observable,所以即使 "wrapper" Observable 被取消,请求也会完成
像这样:
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 and/or 类似的运算符。还有很多,看你想实现什么。。。)。如果所有 Guards return 布尔值而不是 Observable 或 Promise,则 Guard 执行的顺序是在路由中定义的顺序 - 我无法想象 Angular 会改变执行顺序。
我有两个守卫,Guard1 和 Guard2。 Guard1 return 是一个 Observable,Guard2 return 是一个布尔值。
可以激活:[Guard1, Guard2]
假设Guard2会returnfalse,Guard1的请求是不是自动取消了?还是无论如何都会执行调用?
Guard1 的请求将被取消,Guard2 对此负责。我将它与 if
语句进行比较,在该语句中,您将条件与 &&
组合在一起,除了在 Guards 的情况下 execution/result 的顺序未定义(由于某些 Guards 可能是异步的有些不是 - 大多数时候你希望它们并行运行)。如果任何 condition/Guard returns false
总体结果是 false
,则不需要 evaluate/wait 任何其他 condition/Guard 如果其中之一已经 returned false
,因此 运行ning 请求将被取消。
如果您依赖于所有守卫(从守卫发出的请求)执行直到它们全部完成,则有一些方法可以实际控制它 - 但他们所做的不仅仅是守卫一条路线,请记住这一点。当我 运行 进入这种行为时,我将根据我的情况更详细地解释这一点:
我创建了一个简单的 HTTP 缓存来保持较低的请求数。我有一个请求只在一个 Guard 中被触发,但该请求从未完成,因为其他 Guards return 早些时候输入了 false 并且请求被取消了。这个请求从来没有被缓存,因为我没有得到任何结果,因为请求总是被取消(简化版本听起来没用,但它证明了我想说的)。然后我这样做了:
- 我创建了一个 "wrapper" Observable,Guard returnes 作为他的结果
- 这个 "wrapper" Observable 只是将请求的结果(第二个 Observable)传回,作为 Guard 的结果
- Angular 只会 "cancel" returned "wrapper" Observable,所以即使 "wrapper" Observable 被取消,请求也会完成
像这样:
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 and/or 类似的运算符。还有很多,看你想实现什么。。。)。如果所有 Guards return 布尔值而不是 Observable 或 Promise,则 Guard 执行的顺序是在路由中定义的顺序 - 我无法想象 Angular 会改变执行顺序。