分享
三行代码  ›  专栏  ›  技术社区  ›  harry young

为什么我的函数返回Promise{<pending>}[duplicate]

  •  -1
  • harry young  · 技术社区  · 1 周前

    作为我第一个真正的MERN项目,我正在建立一个留言板。我目前正在处理一个节点路由来请求板名及其相关的post count,但是我遇到了一个问题。我没有得到我需要的值,而是收到信息告诉我有一个promise挂起,这看起来很奇怪,因为我使用的是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] ]
    

    1 回复  |  直到 1 周前
        1
  •  3
  •   Nicholas Tower    1 周前
    const postCount = boards.map(async (boardI) => {
      const posts = await Post.find({ board: boardI.slug });
      return [boardI.slug, posts.length];
    });
    

    因为这是一个异步函数,它将返回一个promise。 map 为数组的每个元素调用函数,获取它们返回的承诺,并创建一个包含这些承诺的新数组。

    如果你想等待每一个完成的承诺数组,使用答应。全部把它们组合成一个单一的承诺,然后等待结果。

    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);