通过发出http请求来获取路由解析器的数据,以便第二个请求的结果取决于第一个请求的结果

时间:2018-10-29 13:41:14

标签: javascript angular typescript angular-resolver angular-activatedroute

我的路由模块中有一个解析器

{
    path: 'path1',
    component: FirstComponent,
    resolve: {
     allOrders: DataResolver
    }

}

然后在我的resolve函数中有

resolve(): Observable<Array<string>> {

    return this.serviceA.getAllfooNames()
    .map(result=> {

         /* result is an array of strings*/
         return this.serviceB.getAllBarNames(result[0])

         /*orders is also supposed to be an array of strings*/     
          .map(orders=> return orders)                        
    });

 }
}

我希望根据 allOrders 键存储值 orders 。 我想传递 orders 数组作为ActivatedRoute快照中的数据。请帮忙。

1 个答案:

答案 0 :(得分:1)

您可以混合使用concatMapzip

resolve(): Observable<Array<string>> {
  return this.serviceA.getAllfooNames().pipe(
    concatMap((names) => 
      zip(...names.map((name) => this.serviceB.getAllBarNames(name)))
    ),
    map((...names) => 
      names.reduce((acc, curr) => acc.concat(curr), [])
    ) 
  ); 
}

这将以一大串字符串返回从serviceB调用返回的所有字符串。

基本上它是做什么的,您调用getAllfooNames,用concatMap直到此请求完成,该请求以字符串形式返回一堆名称。之后,您可以使用zip运算符进行选择。该运算符使用数组映射方法执行传递给该对象的所有可观测对象,并在所有可观测对象完成后发出。

然后在映射中将其拾取,该映射接收多个字符串数组作为参数。然后,您使用reduce将其分成一个大数组。