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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:09:00