Promise已resolve仍处于pending状态:按property_id赋值房间数组失败
问题根因
- 你直接将
getAllRooms()返回的Promise对象赋值给了property._doc.property_rooms,没有等待Promise resolve拿到实际的房间数组,所以属性值显示为pending状态的Promise。 - 你没有等待所有
getAllRooms异步请求执行完成,就直接调用next(200)返回响应,导致最终响应数据里携带的是未完成的Promise,而不是实际的房间数据。
解决方案
你需要等待所有房间查询请求完成后,再赋值并返回响应,推荐用Promise.all批量处理循环中的异步请求,以下是修改后的代码:
核心逻辑修改
return getPropertyByVendorId(result._id).then(async (prop) => { // 批量处理所有property的房间查询请求,等待全部完成再往下执行 await Promise.all(prop.map(async (property) => { // 等待getAllRooms resolve拿到实际房间数据再赋值 const rooms = await getAllRooms(property._id); property._doc.property_rooms = rooms; console.log(property); })); // 所有请求都完成后再返回响应 res.message = "Vendor Profile fetched successfully"; res.data = { vendor_info: result, vendor_properties: prop, }; return next(200); });
整体代码优化(async/await写法,避免多层嵌套)
const vendorProfile = catchAsync(async (req, res, next) => { await passport.authenticate("vendor-jwt", { session: false }, async (err, user, info) => { if (err) { res.error = err || info.message; return next(401); } if (!user) { res.error = info.message; return next(401); } try { const result = await getVendorProfileInfo(user._id); if (result == "error") { res.error = "Failed to fetch Vendor Profile"; return next(500); } const prop = await getPropertyByVendorId(result._id); // 等待所有房间查询完成 await Promise.all(prop.map(async (property) => { const rooms = await getAllRooms(property._id); property._doc.property_rooms = rooms; })); res.message = "Vendor Profile fetched successfully"; res.data = { vendor_info: result, vendor_properties: prop, }; return next(200); } catch (err) { Logger.error(err); res.error = "Failed to get vendor profile"; return next(500); } })(req, res, next); });
getAllRooms函数冗余代码简化
原函数里的Promise.resolve是冗余的,因为Room.find本身返回的就是Promise,可以简化为:
const getAllRooms = (propertyId) => { return Room.find({ property_id: propertyId }) .then((result) => result) .catch((err) => { Logger.error(err); return "error"; }); };
内容的提问来源于stack exchange,提问作者Deep Mandal
相关产品推荐
相关产品推荐

