【问题标题】:ReactTS parallel api request calls for zip files downloadReactTS 并行 api 请求调用 zip 文件下载
【发布时间】:2021-09-19 19:58:05
【问题描述】:

我正在使用 React TS,以 Nestjs 作为后端。

上下文

我有一个函数downloadZip(csvProps): 输入 - csv 文件的参数和 API 请求的 url;输出 - 包含 4 个 csv 文件的 Zip 文件

const downloadZip = async (csvProps: any, urlParams: any) => {
        let zip = new JSZip();

        let csv = zip.folder("csv");

        //English Data CSV
        let enDataBlob = await downloadCSV(`${ServerService.getUrl()}/fetchData`, urlParams,
            {...csvProps, filename: 'Data_en', columns: headers_data_en, wrapColumnChar: '"'})
        csv?.file('Data_en.csv', enDataBlob as Blob, {base64: true})

        //French Data CSV
        let frDataBlob = await downloadCSV(`${ServerService.getUrl()}/fetchData`, urlParams,
            {...csvProps, filename: 'Data_fr', columns: headers_data_fr, wrapColumnChar: '"'})
        csv?.file('Data_fr.csv', frDataBlob as Blob, {base64: true})

        //English Flow CSV
        let enFlowBlob = await downloadCSV(`${ServerService.getUrl()}/fetchFlow`, urlParams,
            {...csvProps, filename: 'Flow_en', columns: headers_flow_en, wrapColumnChar: '"'})
        csv?.file('Flow_en.csv', enFlowBlob as Blob, {base64: true})

        //French Flow CSV
        let frFlowBlob = await downloadCSV(`${ServerService.getUrl()}/fetchFlow`, urlParams,
            {...csvProps, filename: 'Flow_fr', columns: headers_flow_fr, wrapColumnChar: '"'})
        csv?.file('Flow_fr.csv', frFlowBlob as Blob, {base64: true})

        zip.generateAsync(({type: "blob"}))
            .then((content) => {
                saveAs(content, csvProps.filename)
            })
    }

上面使用的downloadCSV(url: string, urlParams: any, csvProps: any)函数只是简单的向后端发起一个axios请求,并返回一个响应生成的csv blob:

export const downloadCSV = async (apiURL: string, urlParams: any, csvProps: any) => {
    let csvBlob: Blob|undefined;
    let api = await axios.get(apiURL, {
        params: urlParams
      })
    .then(async (res) => {
        // handleCSV: Gets all CSV related data and returns a csv Blob
        csvBlob = await handleCSV({...csvProps, datas: res.data});
    })
    return csvBlob
}

由于我使用的是async-await,因此 api 请求和随后的 blob 生成过程是按顺序发生的,并且性能受到影响。

问题

有没有办法让这些过程并行?我希望并行处理所有文件,然后最终添加到 zip 中。

【问题讨论】:

    标签: javascript reactjs multithreading nestjs


    【解决方案1】:

    您可以执行Promise.all(apiCalls) 并等待其结果,而不是await 调用每个API 调用,让结果是从API 返回的值数组。类似的东西

    const downloadZip = async (csvProps: any, urlParams: any) => {
      let zip = new JSZip();
    
      let csv = zip.folder("csv");
      const apiCalls = [
        downloadCSV(`${ServerService.getUrl()}/fetchData`, urlParams,
          {...csvProps, filename: 'Data_en', columns: headers_data_en, wrapColumnChar: '"'}),
        downloadCSV(`${ServerService.getUrl()}/fetchData`, urlParams,
          {...csvProps, filename: 'Data_fr', columns: headers_data_fr, wrapColumnChar: '"'}),
        downloadCSV(`${ServerService.getUrl()}/fetchFlow`, urlParams,
          {...csvProps, filename: 'Flow_en', columns: headers_flow_en, wrapColumnChar: '"'}),
        downloadCSV(`${ServerService.getUrl()}/fetchFlow`, urlParams,
          {...csvProps, filename: 'Flow_fr', columns: headers_flow_fr, wrapColumnChar: '"'}),
      ];
      const [enDataBlob, frDataBlob, enFlowBlob, frFlowBlob] = await Promise.all(apiCalls);
      //English Data CSV
      csv?.file('Data_en.csv', enDataBlob as Blob, {base64: true})
    
      //French Data CSV
      csv?.file('Data_fr.csv', frDataBlob as Blob, {base64: true})
    
      //English Flow CSV
      csv?.file('Flow_en.csv', enFlowBlob as Blob, {base64: true})
    
      //French Flow CSV
      csv?.file('Flow_fr.csv', frFlowBlob as Blob, {base64: true})
    
      zip.generateAsync(({type: "blob"}))
        .then((content) => {
          saveAs(content, csvProps.filename)
        })
    }
    

    【讨论】:

    • 谢谢!我实际上最终采用了这种方法,但在 NestJS 后端。
    猜你喜欢
    • 2021-09-10
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2015-10-27
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多