Angular2:Guard 中的嵌套 Observable
Angular2: Nested Observables in Guard
我有一个守卫保护某条路线。在 canActive
方法中,我需要发出两个 http 请求,第二个请求是根据第一个请求的响应触发的。然而,第二个请求从未发出,我认为它是关于 returning Observables 的嵌套构造。
1 canActivate(route: ActivatedRouteSnapshot,
2 state: RouterStateSnapshot) : Observable<boolean>|boolean {
3 return this.provider.getA().map(
4 dataA => {
5 return this.provider.getB().map(
6 dataB => {
7 return (dataB.allowed);
8 }
9 );
}
);
}
getA() 和 getB() return 如下:
getA() : Observable<any> {
return this.http.post(URL,payload).
map(response => response.json());
};
代码已简化,但您可以假设 getA() 和 getB() 正常工作。调用 Guard 时,getA() 会通过网络正常发送,但永远不会发送 getB()。调试器在第 5 行静默退出。
还有一件事,TypeScript 显示了一条警告,可能已经告诉了我解决方案,但是,我对 Observables 太菜鸟了,尤其不知道如何处理它:
Observable<Observable<boolean>>' is not assignable
to type 'Observable<boolean>'
猜测一下,Observables 的构造永远不会解析,这就是为什么没有警告,我一直等到时间结束。我天真的想法是,只要任何 Observable 都是 return 布尔值(如第 7 行所做的那样),订阅者就会知道如何处理它。
很高兴阅读您的提示。去睡觉了...
你应该在这里使用 switchMap
:
return this.provider.getA().switchMap(
dataA => {
return this.provider.getB().map(
dataB => {
return (dataB.allowed);
}
);
}
);
在您的代码中,您正在创建一个 Observable of Observable。 switchMap
展平该结构并通过 A 发出 B 的发射项。
我有一个守卫保护某条路线。在 canActive
方法中,我需要发出两个 http 请求,第二个请求是根据第一个请求的响应触发的。然而,第二个请求从未发出,我认为它是关于 returning Observables 的嵌套构造。
1 canActivate(route: ActivatedRouteSnapshot,
2 state: RouterStateSnapshot) : Observable<boolean>|boolean {
3 return this.provider.getA().map(
4 dataA => {
5 return this.provider.getB().map(
6 dataB => {
7 return (dataB.allowed);
8 }
9 );
}
);
}
getA() 和 getB() return 如下:
getA() : Observable<any> {
return this.http.post(URL,payload).
map(response => response.json());
};
代码已简化,但您可以假设 getA() 和 getB() 正常工作。调用 Guard 时,getA() 会通过网络正常发送,但永远不会发送 getB()。调试器在第 5 行静默退出。
还有一件事,TypeScript 显示了一条警告,可能已经告诉了我解决方案,但是,我对 Observables 太菜鸟了,尤其不知道如何处理它:
Observable<Observable<boolean>>' is not assignable
to type 'Observable<boolean>'
猜测一下,Observables 的构造永远不会解析,这就是为什么没有警告,我一直等到时间结束。我天真的想法是,只要任何 Observable 都是 return 布尔值(如第 7 行所做的那样),订阅者就会知道如何处理它。
很高兴阅读您的提示。去睡觉了...
你应该在这里使用 switchMap
:
return this.provider.getA().switchMap(
dataA => {
return this.provider.getB().map(
dataB => {
return (dataB.allowed);
}
);
}
);
在您的代码中,您正在创建一个 Observable of Observable。 switchMap
展平该结构并通过 A 发出 B 的发射项。