场景:在ngOnInit上,我需要调用3个API,Fork-Join,并将数据保存到一个数组中.第一接口是独立的.第二个也是独立的,但第三个取决于第二个API的响应.

我以前没有用过forkJoin或mergeap,我有点困惑.

What's happening :

我已经创建了一个通用方法,该方法使用一个标识符来确定要命中哪个端点和具有所需参数的对象,然后进行响应和错误处理.

服务文件:

  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的响应.2号的回复不见了,我不知道是怎么回事.

这是我写的方法:


  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得到第三个响应,然后运行映射,返回数组中的secondResponsethirdResponse的各个值!

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相关问答推荐

JavaScript代理不适用于打开的窗口对象

在JavaScript中逐一播放随机生成的音频文件数组

将未等待的未处理的错误promise 转变为警告@ changeTicksAndRejections(由当时的抛出错误创建)

HTML/JavaScript函数未执行

错误:找不到react-redux上下文值;请确保该组件包装在React原生Expo应用程序中的提供者中

试图为每支球队生成类似于2024/25年欧洲足联冠军联赛瑞士系统格式的独特比赛配对

如何在alpinejs中显示dev中x-for的元素

如何按预期聚合SON数据?

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

我不知道为什么我的JavaScript没有验证我的表单

类型脚本中只有字符串或数字键而不是符号键的对象

Chrome是否忽略WebAuthentication userVerification设置?""

无法访问Vue 3深度监视器中对象数组的特定对象值'

无法读取未定义错误的属性路径名''

提交链接到AJAX数据结果的表单

本地库中的chartjs-4.4.2和chartjs-plugin-注解

将嵌套数组的元素乘以其深度,输出一个和

使用可配置项目创建网格

bootstrap S JS赢得了REACT中的函数/加载

无法使用Redux异步函数读取未定义的useEffect钩子的属性';map';