为啥我的函数返回 Promise <pending> [重复]

Posted

技术标签:

【中文标题】为啥我的函数返回 Promise <pending> [重复]【英文标题】:Why is my function returning Promise <pending> [duplicate]为什么我的函数返回 Promise <pending> [重复] 【发布时间】:2021-01-03 20:01:18 【问题描述】:

作为我的第一个真正的 MERN 项目,我正在构建一个留言板。我目前正在研究一个节点路由,以请求具有相关帖子计数的板名称,但我遇到了一个问题。我收到的信息不是我需要的值,而是告诉我有一个未决的承诺,这看起来很奇怪,因为我正在使用 async/await。函数如下:

exports.postsPerBoard = async (req, res) => 
  try 
    const boards = await Board.find();

    const postCount = boards.map(async (boardI) => 
      const posts = await Post.find( board: boardI.slug );
      return [boardI.slug, posts.length];
    );
    console.log(postCount);
    res.send(postCount);
   catch (err) 
    console.error(err.message);
    res.status(500).send('server error');
  
;

这是控制台日志的结果:

[0] [
[0]   Promise  <pending> ,
[0]   Promise  <pending> ,
[0]   Promise  <pending> ,
[0]   Promise  <pending> ,
[0]   Promise  <pending> 
[0] ]

在此先感谢您提供的所有/任何帮助! :)

【问题讨论】:

当你调用一个没有await的异步函数时,它会返回一个promise。 使用Promise.all()解决所有的promise。 我不认为我已经这样做了,但是......我有吗? boards.map(async ...) 正在调用异步函数而不使用await @Barmar - board.map 不是异步的 - 它返回相同的数组,带或不带 await 【参考方案1】:
const postCount = boards.map(async (boardI) => 
  const posts = await Post.find( board: boardI.slug );
  return [boardI.slug, posts.length];
);

由于这是一个异步函数,它会返回一个 Promise。 map 为数组的每个元素调用该函数,获取它们返回的 Promise,并创建一个包含这些 Promise 的新数组。

如果您想等待每个 promise 数组完成,请使用 Promise.all 将它们组合成一个 promise,然后等待结果。

const promises = boards.map(async (boardI) => 
  const posts = await Post.find( board: boardI.slug );
  return [boardI.slug, posts.length];
);
const postCount = await Promise.all(promises);
console.log(postCount);

【讨论】:

太棒了!谢谢尼古拉斯 为什么我需要等待它们呢?我不是已经在地图功能中这样做了吗? (谢谢,它正在工作!) 异步函数返回 Promise,它们是同步的。 map 不检查类型:无论返回什么,这就是进入新数组的内容。因此,由于返回了 Promise,因此 Promise 进入了数组。至于函数内部的await,当返回的promise解析时会延迟,但不会改变promise(过去时)返回的事实。

以上是关于为啥我的函数返回 Promise <pending> [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Promise 返回 undefined 和 status pending

当异步函数不应该返回 Promise 时,为啥我需要等待它?

为啥这个 Firebase Function Promise 没有返回正确的错误?

为啥 Promise 构造函数需要一个在完成时调用 'resolve' 的函数,但 'then' 不需要 - 它返回一个值?

为啥 fetch 返回 promise 未决?

为啥我的 apolloFetch 调用在从 promise.all 中调用时返回一个空查询?