在路由解析器中调用嵌套的http返回Observable而不是数据

时间:2018-08-31 05:57:13

标签: angular typescript observable angular-routing

我正在尝试在resolve.ts中调用嵌套的HTTP调用。并以以下方式实现。

app.route.js:
    { 
     path: 'result/:start_date/:end_date', 
     component: ResultComponent,
     resolve:{hnData:ResultResolver}
    }

以下是我的解析器代码

result.resolver.ts

   resolve(route: ActivatedRouteSnapshot) {
   return this.service.firstHttp()
     .pipe(
      map((data)=>{

      param['data_from_firstHttp']= data.result;
      param['checkinDate']=route.paramMap.get('start_date');
      param['checkoutDate']=route.paramMap.get('end_date');

      return this.service.searchListing(param);


   })
 )

和组件代码

result.component.ts

    { hnData : Observable}

在此组件中,我期望从serchListing服务方法获得结果,但是我变得可以观察到了。

1 个答案:

答案 0 :(得分:0)

firstHttp(): Observable<data1>;
searchListing(): Observable<data2>;

// you are trying to map:
map(Observable<data1>): Observable<Observable<data2>>

问题是-如何展平?

RxJ有几种方法:

1)我们是否需要处理每个内部Observable中的所有事件?
mergeMap/concatMap-事件的顺序重要吗?

2)我们可以跳过内部Observable的某些事件吗?
switchMap/exhaustMap-新事件是否具有更高的优先级?

您可以将map上的mergeMap替换为可观察的平面。

resolve(route: ActivatedRouteSnapshot) {
  return this.service.firstHttp()
    .pipe(
      mergeMap((data)=>{

        param['data_from_firstHttp']= data.result;
        param['checkinDate']=route.paramMap.get('start_date');
        param['checkoutDate']=route.paramMap.get('end_date');

        return this.service.searchListing(param);
  })
)