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
相关产品推荐
相关产品推荐

