为啥我的函数返回 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' 不需要 - 它返回一个值?