async/await未暂停脚本执行,验证检查失效问题求助
问题分析与解决方案
问题根源
- 第一段代码中,
map循环里调用的checking()是异步函数,但没有用await等待它执行完成,且Array.map本身不会处理异步任务。这就导致循环后续的console.log以及最外层的checkValidPrice.includes("false")判断会先执行,而此时数据库查询的异步操作还没完成,所以数组是空的。 - 你尝试的
Promise.all写法里,没有对Product.findById加await,拿到的dbPrice其实是一个Promise对象,而非数据库返回的文档,自然取不到正确的price值,判断逻辑完全失效。
正确实现代码
// 确保外层API处理函数是async类型 async function validateProductPrices(req) { // 用Promise.all等待所有价格校验异步任务完成 const checkValidPrice = await Promise.all( req.body.products.map(async (item) => { const itemPrice = item.price; console.log(`item price: ${itemPrice}`); // await获取数据库返回的价格文档 const dbPriceDoc = await Product.findById(item.productId, "price"); const dbPrice = dbPriceDoc.price; console.log(`dbPrice: ${dbPrice}`); // 直接返回价格对比的布尔结果 return itemPrice === dbPrice; }) ); console.log(`check price printing: ${checkValidPrice}`); console.log(`func? ${checkValidPrice.includes(false)}`); // 可根据校验结果返回对应响应 // if (checkValidPrice.includes(false)) { // return res.status(400).send("部分商品价格不匹配"); // } }
改动说明
- 给
map的回调函数加上async,让每个回调返回Promise,Promise.all可等待所有异步任务完成后统一返回结果数组。 - 对
Product.findById加await,确保拿到实际数据库文档后再读取price值,避免操作未完成的Promise对象。 - 直接在回调中返回价格对比的布尔值,
Promise.all会自动收集所有结果到数组,无需手动调用push,代码更简洁可靠。 - 外层函数必须声明为
async,否则无法使用await Promise.all语法。
预期控制台输出
item price: 350 dbPrice: 350 check price printing: true func? false
内容的提问来源于stack exchange,提问作者Texas12
相关产品推荐
相关产品推荐

