上面的代码是使用zip操作符将三个HTTP请求合并为一个可观察对象,并返回一个新的Promise。下面是该方法的标准写法:

return new Promise(resolve => {
  zip(
    this.httpClient.get(`assets/tmp/i18n/${this.i18n.defaultLang}.json`),
    this.httpClient.get("assets/tmp/app-data.json"),
    this.httpClient.post(
      "https://csdquote.idpbg.efoxconn.com:1443/menus/getMenusByEmpNO",
      { EmpNo: userAccount, SysId: "30326" }
    )
  ).subscribe(([i18nData, appData, menusData]) => {
    resolve({ i18nData, appData, menusData });
  });
});

上述代码使用subscribe方法订阅zip操作符的结果,并在数据到达时调用resolve方法将数据传递给Promisethen回调函数。

类似的方法还有forkJoincombineLatest。下面是使用forkJoin的示例:

return new Promise(resolve => {
  forkJoin([
    this.httpClient.get(`assets/tmp/i18n/${this.i18n.defaultLang}.json`),
    this.httpClient.get("assets/tmp/app-data.json"),
    this.httpClient.post(
      "https://csdquote.idpbg.efoxconn.com:1443/menus/getMenusByEmpNO",
      { EmpNo: userAccount, SysId: "30326" }
    )
  ]).subscribe(([i18nData, appData, menusData]) => {
    resolve({ i18nData, appData, menusData });
  });
});

使用forkJoin时,它将等待所有请求完成后才发出结果。

使用combineLatest的示例:

return new Promise(resolve => {
  combineLatest([
    this.httpClient.get(`assets/tmp/i18n/${this.i18n.defaultLang}.json`),
    this.httpClient.get("assets/tmp/app-data.json"),
    this.httpClient.post(
      "https://csdquote.idpbg.efoxconn.com:1443/menus/getMenusByEmpNO",
      { EmpNo: userAccount, SysId: "30326" }
    )
  ]).subscribe(([i18nData, appData, menusData]) => {
    resolve({ i18nData, appData, menusData });
  });
});

combineLatest会在任何一个请求有新数据到达时发出结果

return new Promiseresolve = zip thishttpClientgetassetstmpi18n$thisi18ndefaultLangjson thishttpClientgetassetstmpapp-datajson thishttpClientpost httpscsdquoteidpbge

原文地址: https://www.cveoy.top/t/topic/izii 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录