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

