【问题标题】: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

标签: javascript node.js mongoose promise


【解决方案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(过去时)返回的事实。
猜你喜欢
  • 2022-01-09
  • 2020-07-25
  • 2021-04-21
  • 2021-08-04
  • 2020-09-30
  • 2019-12-23
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多