You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中forkJoin与mergeMap调用3个API丢失第二个响应的问题

解决forkJoin合并API请求时丢失第二个API响应的问题

你的问题出在response2的管道处理上:用mergeMap之后,原本第二个API的响应被转换成了第三个API的请求,所以forkJoin里的response2最终只返回第三个API的结果,第二个API的响应自然丢失了。要拿到三个API的完整响应,需要在mergeMap里同时保留第二个和第三个API的结果。

修改方案

调整response2的管道逻辑,在请求完第三个API后,把第二个API的结果和第三个的结果一起返回,最后在forkJoin订阅时解构出三个响应并整理成数组:

fetchAllData() {
  let inp = this.input_row;

  // 第一个独立API请求
  let response1 = this.service.callMethod('rate_plan', { 
    companyId: inp.cpnyId, 
    servAbbr: inp.servAbbr, 
    productNumber: inp.prdctNo, 
    orgNumber: inp.orgNo, 
    rateCategory: inp.rateCat, 
    ratePlanNumber: inp.ratePlanNo 
  });

  // 第二个API + 依赖它的第三个API,同时保留两个响应
  let response2And3 = this.service.callMethod('approve_rate', { 
    prodctNo: inp.prdctNo, 
    servAbbr: inp.servAbbr, 
    companyId: inp.cpnyId, 
    ratePlanNo: inp.ratePlanNo 
  }).pipe(
    map(item => {
      this.approveRate = item;
      return item[0]; // 提取后续请求需要的appRate数据
    }),
    mergeMap(appRate => 
      // 请求第三个API后,把第二个和第三个的响应打包返回
      this.service.callMethod('rate_detail', { 
        companyId: inp.cpnyId, 
        ratePlanNo: inp.ratePlanNo, 
        rateCaseGrpngNo: appRate['rateCaseGrpngNo'] 
      }).pipe(
        map(rateDetail => ({ approveRate, rateDetail }))
      )
    )
  );

  forkJoin([response1, response2And3]).subscribe(([ratePlan, combinedData]) => {
    // 整理成包含三个独立对象的数组
    const allResponses = [ratePlan, combinedData.approveRate, combinedData.rateDetail];
    console.log(allResponses);
    // 这里可以把allResponses存入你需要的数组变量中
  });
}

逻辑说明

  1. response2And3先请求第二个API,拿到结果后提取出后续请求需要的appRate数据
  2. 通过mergeMap发起第三个API请求,并用map把第二个API的appRate和第三个API的rateDetail打包成一个对象返回
  3. forkJoin订阅时,解构出第一个API的响应,以及第二个+第三个的组合数据,最后整理成包含三个独立对象的数组

内容的提问来源于stack exchange,提问作者MenimE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:06:38