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

调用async异步函数返回Promise<pending>如何获取resolve后的结果

问题原因

所有async标记的函数返回值本身就是Promise实例,你调用时未添加await关键字,所以直接拿到了处于pending状态的Promise对象,而非resolve后的执行结果。
另外你的辅助函数存在隐藏bug:map遍历的异步回调中没有返回查询结果,最终Promise.all拿到的结果都会是undefined。

修正代码

1. 修正辅助函数

const getFeedPhotos = async (followingArr) => {        
  const promises = followingArr.map(async userId => { 
    // 补充return,返回查询到的图片结果
    return Photo.find({userId: mongoose.Types.ObjectId(userId)});
  });
  return Promise.all(promises);
};

2. 修正路由调用逻辑

photoRouter.get(
    '/feed',
    expressAsyncHandler(async (req, res) => {
      const following = req.body.following;

      if (following) {
        // 添加await等待异步执行完成,拿到resolve后的结果
        const response = await getFeedPhotos(following);
        console.log(response);
        // 可选:如果需要把所有用户的图片合并为一维数组,使用flat()处理
        // const allPhotos = response.flat();
        // 返回结果给客户端
        res.status(200).send(response);
      } else {
          res.status(400).send({ message: '"Following" is not provided.' })
      }

    })
  );

额外注意事项

  • 按照HTTP规范,GET请求通常不携带请求体,部分代理、客户端会默认丢弃GET请求的body,建议将该接口改为POST请求,或者将following参数放到URL查询参数中传递。
  • Promise.all会并行执行所有查询请求,如果你的关注列表非常长,可能需要考虑添加并发限制,避免数据库请求压力过大。

内容的提问来源于stack exchange,提问作者ArtemNovikov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:09:02