switchMap运算符后如何返回结果

时间:2020-01-26 15:26:44

标签: angular rxjs

我有嵌套的http调用服务。第一次请求后,我想用先前的结果做另一个,并在完成后返回所有数据。我需要使用result [“ Expert”]传递数据,该结果是一个包含对象{User_key:key1}的数组。因此,switchMap的第一步是使用地图运算符并生成JSON,然后将其传递给http请求。

service.ts

getAreaByKey(key: string): Observable<Area> {
  return this.http.get<any[]>(`${this.API_URL}/v0/areas/${key}`).pipe(
    map(result => {
      return {
        key: result["Key"],
        name: result["Description"],       
        experts: result["Experts"]
      };
  }),
  switchMap(res => {
    res.experts.map(el => {
      let json_data = JSON.stringify(el["User_Key"]);
      this.expertService.getExpertsByKeys(json_data);
    });
  })
}

问题是我试图在switchMap之后返回数据,但显示错误。另外,我在开发工具中看不到第二个请求。

2 个答案:

答案 0 :(得分:0)

我猜您正在寻找类似combineLatest的东西吗?您有多个输入可观察对象,但对所有这些对象的结果感兴趣(例如,您的案例中有很多专家)。

尝试这样的事情:

switchMap(res => {
    return combineLatest(res.experts.map(el => {
      let json_data = JSON.stringify(el["User_Key"]);
      return this.expertService.getExpertsByKeys(json_data);
    }));
  })

答案 1 :(得分:0)

SwithMap需要获得一个可观察的回报。您可以使用forkJoin合并result的所有元素,并生成另一个可观察到的内容,switchMap可以在内部进行预订。

getAreaByKey(key: string): Observable < Area > {
  return this.http.get < any[] > (`${this.API_URL}/v0/areas/${key}`)
    .pipe(
        map(result => {
            return {
                key: result["Key"],
                name: result["Description"],
                experts: result["Experts"]
            };
        }),
         switchMap(res => forkJoin([
           ...res.experts.map(el => this.expertService.getExpertsByKeys(JSON.stringify(el["User_Key"])))])
     )
    );
}