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

React中如何用单个按钮处理函数发起多个PDF生成POST请求?

合并两个PDF生成请求到单个按钮处理函数

问题背景

现有两个独立的POST接口用于生成PDF,分别对应两个按钮的处理函数,现在需要点击一次按钮即可触发两个接口请求,生成并打开两个PDF文件。后端接口运行正常,需在React/JavaScript中实现该合并逻辑。

原两个处理函数代码如下:

const handleViewOrder = async () => {
    try {
      const response = await fetch('/generate_pdf', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
      });
      const responseData = await response.json();
      const pdfURL = responseData.pdf_url; 
      localStorage.setItem("pdf_url",pdfURL)
      window.open(pdfURL, '_blank');
      if (!response.ok) {
        throw new Error('Network response was not ok');
      }
    } catch (error) {
      console.error('Error fetching data:', error);
    }
  };

const handleProductSellsPdf = async () => {
    try {
      const response = await fetch('/generate_item_pdf', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
      });
      const responseData = await response.json();
      const pdfURL = responseData.pdf_url; 
      localStorage.setItem("pdf_url",pdfURL)
      window.open(pdfURL, '_blank');
      if (!response.ok) {
        throw new Error('Network response was not ok');
      }
    } catch (error) {
      console.error('Error fetching data:', error);
    }
  };

解决方案

1. 提取公共请求函数

两个处理函数逻辑高度重复,仅接口地址不同,先提取公共函数减少冗余:

// 公共PDF生成请求函数
const generatePdf = async (endpoint) => {
  try {
    const response = await fetch(endpoint, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
    });
    if (!response.ok) {
      throw new Error(`请求${endpoint}失败: Network response was not ok`);
    }
    const responseData = await response.json();
    const pdfURL = responseData.pdf_url;
    // 原代码中两个请求会覆盖同一个localStorage key,建议修改为不同key或移除(若无需持久化)
    localStorage.setItem(`pdf_url_${endpoint.split('/')[1]}`, pdfURL);
    window.open(pdfURL, '_blank');
    return pdfURL;
  } catch (error) {
    console.error('生成PDF出错:', error);
    throw error; // 可选:向上抛出错误便于外部处理
  }
};

2. 合并为单个处理函数

根据需求选择并行或串行执行请求:

方式一:并行执行(推荐,效率更高)

使用Promise.all同时发起两个请求,无需等待第一个完成再执行第二个:

const handleGenerateBothPdfs = async () => {
  try {
    // 同时发起两个请求
    await Promise.all([
      generatePdf('/generate_pdf'),
      generatePdf('/generate_item_pdf')
    ]);
    console.log('两个PDF已成功生成并打开');
  } catch (error) {
    console.error('生成PDF过程中出现错误:', error);
  }
};

方式二:串行执行(适用于有依赖关系的场景)

如果需要确保第一个PDF生成完成后再生成第二个,可使用await依次调用:

const handleGenerateBothPdfs = async () => {
  try {
    await generatePdf('/generate_pdf');
    await generatePdf('/generate_item_pdf');
    console.log('两个PDF已按顺序生成并打开');
  } catch (error) {
    console.error('生成PDF过程中出现错误:', error);
  }
};

3. 在React中使用合并后的函数

将合并后的处理函数绑定到单个按钮:

<button onClick={handleGenerateBothPdfs}>生成全部PDF</button>

注意事项

  • 浏览器可能会阻止自动弹出多个窗口,建议提醒用户允许弹窗(点击按钮本身属于用户交互,大部分浏览器会允许)。
  • 原代码中两个请求会覆盖同一个localStorage的pdf_url键,建议修改为不同的键名(如示例中的pdf_url_generate_pdf和pdf_url_generate_item_pdf),如果不需要持久化PDF地址,可直接移除localStorage.setItem代码。

内容的提问来源于stack exchange,提问作者Nahid From Japan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:13:24