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

Node.js应用中多await代码优化:Promise.all如何实现?

优化方案:并行请求 + 无副作用函数重构

1. 重构getBooks函数

原函数依赖外部传入数组并修改,属于带副作用的写法。我们可以让它直接返回处理后的书籍数组,消除外部状态依赖:

const getBooks = async (url) => {
  try {
    const res = await axios.get(`${url}?api-key=${API.Key}`);
    const books = res.data.results.books;
    return books.map(book => new Book(
      book.primary_isbn13,
      book.title,
      book.author
    ));
  } catch (error) {
    console.error(error);
    return []; // 请求失败返回空数组,避免渲染逻辑报错
  }
};

2. 使用Promise.all并行执行请求

原代码的顺序await会让第二个请求等待第一个完成才发起,用Promise.all可以同时触发两个请求,大幅缩短总等待时间:

app.get('/', async (req, res) => {
  // 同时发起两个API请求,等待全部完成后解构结果
  const [fic, non] = await Promise.all([
    getBooks(API.URL_HARDCOVER_FICTION),
    getBooks(API.URL_HARDCOVER_NONFICTION)
  ]);
  
  // 将结果直接传入渲染逻辑
  res.render('layout', { results: { fic, non } });
});

关键改进说明

  • 并行请求优化:Promise.all让两个请求同时执行,总耗时等于最慢请求的耗时,而非两个请求耗时之和。
  • 无副作用设计:重构后的getBooks仅返回结果,不修改外部变量,代码更易测试和维护。
  • 代码可读性提升:统一使用async/await替代async/await与.then混用的写法,逻辑更清晰。
  • 容错处理:在getBooks内部捕获错误并返回空数组,避免单个请求失败导致整个页面无法渲染(可根据业务需求调整错误处理逻辑)。

内容的提问来源于stack exchange,提问作者AlexP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:15:38