Async函数未返回响应问题排查及代码优化建议
问题解决:无法获取async函数返回值
你当前的立即执行async函数仅通过return result返回结果,但Node.js环境中,顶层异步函数返回的Promise不会自动输出内容。必须显式消费这个Promise的结果,比如添加console.log打印,同时加上错误处理避免崩溃:
(async () => { try { const result = await getProductDetailByProductID(1); console.log(result); // 这里会输出最终构建的JSON对象 } catch (err) { console.error('执行出错:', err); } })();
代码优化建议
1. 并行读取文件提升性能
原代码串行读取4个文件,它们之间无依赖关系,用Promise.all并行读取可大幅减少等待时间:
// 并行读取并解析所有文件 const [productsData, reviewsData, customersData, imagesData] = await Promise.all([ fs.readFile(productsFile, 'utf-8').then(JSON.parse), fs.readFile(reviewsFile, 'utf-8').then(JSON.parse), fs.readFile(customersFile, 'utf-8').then(JSON.parse), fs.readFile(imagesFile, 'utf-8').then(JSON.parse) ]); const { products } = productsData; const { reviews } = reviewsData; const { customers } = customersData; const { images } = imagesData;
2. 用Map替代filter优化数据查找
原代码多次用filter遍历数组查找数据,时间复杂度高。提前将数据转为Map,通过id直接取值(O(1)复杂度):
// 构建查找用的Map const customerMap = new Map(customers.map(c => [c.id, c])); const imageMap = new Map(images.map(img => [img.id, img])); // 转换reviews数据时直接通过Map获取 const reviewsData = reviews.map(review => { const customer = customerMap.get(review.customer_id); const reviewImages = review.images.map(imgId => imageMap.get(imgId)).filter(Boolean); return { id: review.id, rating: review.rating, customer, images: reviewImages }; });
3. 修复未声明的变量问题
原代码中customer变量未用let/const声明,会成为全局变量,必须添加变量声明(上述优化代码已修复)。
4. 处理产品不存在的边界情况
如果传入的id找不到对应产品,后续product.id会报错,需提前判断:
const product = products.find(p => p.id === id); // 用find替代filter[0]更高效直观 if (!product) { throw new Error(`找不到ID为${id}的产品`); }
优化后的完整代码
const path = require('path'); const fs = require('fs/promises'); const getProductDetailByProductID = async (id) => { // 统一管理文件路径,提升可读性 const basePath = path.join(__dirname, 'turing_tasks'); const filePaths = { products: path.join(basePath, 'products.json'), reviews: path.join(basePath, 'reviews.json'), customers: path.join(basePath, 'customers.json'), images: path.join(basePath, 'images.json') }; // 并行读取并解析所有文件 const [productsData, reviewsData, customersData, imagesData] = await Promise.all([ fs.readFile(filePaths.products, 'utf-8').then(JSON.parse), fs.readFile(filePaths.reviews, 'utf-8').then(JSON.parse), fs.readFile(filePaths.customers, 'utf-8').then(JSON.parse), fs.readFile(filePaths.images, 'utf-8').then(JSON.parse) ]); const { products } = productsData; const product = products.find(p => p.id === id); if (!product) { throw new Error(`产品ID ${id} 不存在`); } const { reviews } = reviewsData; const { customers } = customersData; const { images } = imagesData; // 构建查找用的Map const customerMap = new Map(customers.map(c => [c.id, c])); const imageMap = new Map(images.map(img => [img.id, img])); // 格式化reviews数据 const reviewsDataFormatted = reviews.map(review => { const customer = customerMap.get(review.customer_id); const reviewImages = review.images .map(imgId => imageMap.get(imgId)) .filter(Boolean); // 过滤掉不存在的图片 return { id: review.id, rating: review.rating, customer, images: reviewImages }; }); return { id: product.id, name: product.name, reviews: reviewsDataFormatted }; }; // 执行并输出结果 (async () => { try { const result = await getProductDetailByProductID(1); console.log('产品详情:', result); } catch (err) { console.error('获取产品详情失败:', err.message); } })();
内容的提问来源于stack exchange,提问作者wayne
相关产品推荐
相关产品推荐

