【问题标题】:Angular2: Nested Observables in GuardAngular2:Guard 中的嵌套 Observables
【发布时间】:2016-10-01 16:09:47
【问题描述】:

我有一个守卫保护某条路线。在canActive 方法中,我需要发出两个http 请求,根据第一个响应触发第二个http 请求。然而,第二个请求从未发出,我认为它是关于返回 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() 都返回以下内容:

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 返回一个布尔值(如第 7 行中所做的那样),订阅者就会知道如何处理它。

我很高兴阅读您的提示。去睡觉吧……

【问题讨论】:

    标签: angular typescript router observable guard


    【解决方案1】:

    你应该在这里使用switchMap

    return this.provider.getA().switchMap(
      dataA => {
        return this.provider.getB().map(
          dataB => {
            return (dataB.allowed);
          }
        );
      }
    );
    

    在您的代码中,您正在创建 Observable 的 Observable。 switchMap 展平该结构并通过 A 发射 B 的发射项。

    【讨论】:

    • 就是这样。我想我会坐下来学习完整的 Observables 教程。
    • 去吧。你能用它们做什么真是不可思议。看看“rx弹珠”!
    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2022-01-24
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多