javascript - Angular - 使用 mergeMap 从 2 个 API 获取数据并将它们保存在数组中

标签 javascript angular rxjs observable fork-join

场景:在 ngOnInit 上,我需要调用 3 个 API,对它们进行 Fork-Join 并将数据保存在数组中。第一个 API 是独立的。第 2 个也是独立的,但第 3 个依赖于第 2 个 API 的响应。

我以前没有使用过 forkjoin 或 mergemap,我有点困惑。

发生了什么:

我创建了一个通用方法,它采用标识符来确定要命中的端点以及具有所需参数的对象,然后进行响应和错误处理。

服务文件:

  callMethod(str, obj, cb?) {
    return new Observable(observer => {
      this.httpService.getHttpParams(this.URLS_CONSTANT[str], obj, res => {
        observer.next(res.data.content ? res.data.content : res.data);
        observer.complete();
      }, err => { })
    })

  }

因此,我能够从所有 3 个 API 获取响应,但 fork-join 后的最终结果包含第一个和第三个 API 的响应。缺少 2nd 的响应,我不知道发生了什么。

这是我写的方法:


  fetchAllData() {
    let inp = this.input_row;


    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 });

    let response2 = this.service.callMethod('approve_rate', { prodctNo: inp.prdctNo, servAbbr: inp.servAbbr, companyId: inp.cpnyId, ratePlanNo: inp.ratePlanNo }).pipe(map(item => {
        this.approveRate = item
        let appRate = item[0]
        return appRate
      }), mergeMap(data => this.service.callMethod('rate_detail', { companyId: inp.cpnyId, ratePlanNo: inp.ratePlanNo, rateCaseGrpngNo: data['rateCaseGrpngNo']})) )

      forkJoin([response1, response2]).subscribe(x => console.log(x))
  }

}

最终控制台具有 API 调用 1 和 3 的响应值。创建具有三个独立对象的数组需要进行哪些更改。如果需要更多说明,请告诉我。

最佳答案

您的方法很完美,但第二个响应可以通过 switchMap 运行以获得第三个响应,然后运行映射,以返回 secondResponse 的各个值> 和 thirdResponse 在数组中!

fetchAllData() {
    let inp = this.input_row;

    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,
    });

    let response2 = this.service
        .callMethod('approve_rate', {
            prodctNo: inp.prdctNo,
            servAbbr: inp.servAbbr,
            companyId: inp.cpnyId,
            ratePlanNo: inp.ratePlanNo,
        })
        .pipe(
            switchMap(responsesecond => {
                this.approveRate = responsesecond;
                let appRate = responsesecond[0];
                return this.service
                    .callMethod('rate_detail', {
                        companyId: inp.cpnyId,
                        ratePlanNo: inp.ratePlanNo,
                        rateCaseGrpngNo: responsesecond['rateCaseGrpngNo'],
                    })
                    .pipe(
                        map(responsethird => {
                            return [responsesecond, responsethird];
                        })
                    );
            })
        );

    forkJoin([response1, response2]).subscribe(x => console.log(x));
}

关于javascript - Angular - 使用 mergeMap 从 2 个 API 获取数据并将它们保存在数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73541454/

相关文章:

javascript - 如何禁用下拉元素中的特定项目

javascript - Facebook如何在不刷新的情况下更新点赞?

angular - ngx-leaflet/Angular 2 中带有下拉选择输入的属性绑定(bind) map 单击事件

angular 2 - 如何设置 <select> 默认选择选项

node.js - 有没有办法使用 React 和 Observables (rx.js) 将文件上传到 Node.js?

javascript - 如何从方法创建 rxjs observable

javascript - map 中的多个样式集群

javascript - 如何从$$state对象获取数据

node.js - 我无法在 ubuntu 上安装 @angular/cli

javascript - 将参数传递到可观察数组中