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

Node.js Express中如何并行发起HTTP请求待数据返回后执行代码

问题根源

你现在的嵌套写法是典型的串行请求:必须等第一个/classes接口完整返回后,才会发起第二个/meetings请求,总耗时是两个接口的耗时相加,平白多等了一倍时间。

并行实现方案

直接用JS内置的Promise.all就行,它会同时发起传入的所有异步请求,等所有请求都成功返回后再执行后续逻辑,总耗时只等于两个接口里耗时更长的那个的时间,延迟能直接降一半。

方案1:保留原有Promise链式写法

不需要改动现有函数结构,直接把两个axios请求放进数组传给Promise.all即可:

Promise.all([
  axios.get(`https://schoolserver.com/classes`, config),
  axios.get(`https://schoolserver.com/meetings`, config)
])
.then(([classesRes, meetingsRes]) => {
  const classes = classesRes.data.value;
  const meetings = meetingsRes.data.value;
  // 注意express的send方法只接收一个参数,把两个数据放进对象返回即可
  response.send({ classes, meetings });
})
.catch((err) => {
  console.log(err);
  response.status(500).send('数据获取异常');
});

方案2:更易维护的async/await写法

现在Node.js版本原生支持async/await,写出来没有回调嵌套,逻辑更清晰,是目前的主流写法:

// 给Express路由处理函数加上async关键字
app.get('/your-api-path', async (req, res) => {
  try {
    // 两个请求会并行发起
    const [classesRes, meetingsRes] = await Promise.all([
      axios.get(`https://schoolserver.com/classes`, config),
      axios.get(`https://schoolserver.com/meetings`, config)
    ]);
    const classes = classesRes.data.value;
    const meetings = meetingsRes.data.value;
    res.send({ classes, meetings });
  } catch (err) {
    console.log('接口请求失败:', err);
    res.status(500).send('服务端数据获取失败');
  }
})
补充注意点
  • Promise.all默认是快速失败逻辑:只要任意一个请求报错,就会直接进入catch流程,适合两个接口的数据都是页面必须内容的场景。
  • 如果业务允许其中一个接口失败、仍然返回另一个接口的有效数据,可以替换成Promise.allSettled,它会等待所有请求执行完成(无论成功失败),返回每个请求的状态和对应结果,你可以按需处理成功/失败的分支。

内容的提问来源于stack exchange,提问作者Abdur-Rahman Rana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:54:35