如何在异步函数中将对象推入数组

时间:2019-06-23 07:56:25

标签: node.js

我一直在尝试将对象插入异步函数的数组中,但是它 返回空数组作为nodejs中的输出,猫鼬

var data = [];

app.get("/api/post", async (req, res) => {
  const post = await UserPost.find();

  post.forEach(async element => {
    const email = await element.userid;
    const user = await Account.find({ email });
    const usern = await user[0].username;

    var userobject = {
      element,
      usern
    };
    //Promise.all(userobject)
    data.push(userobject);
  });

  console.log(data);

  res.send({ data });
});

1 个答案:

答案 0 :(得分:0)

看来您在兑现诺言。为了实现此特定方案,可以使用Promise.allArray.map

这是我为您编辑的代码:

(*请注意,为了说明起见,这只是一个伪代码)

app.get("/api/post", async (req, res) => {
  try {
    const posts = await dummyPromiseResolver(); // first promise

    const promises = posts.map(async element => {
      const user = await dummyEmailReturn(element.userid); // second promise
      const usern = user[0].username;
      return {
        usern,
        ...element
      };
    });

    const fresult = await Promise.all(promises);
    res.send(fresult);
  } catch (error) {
    console.error("error in posts fetch:" + error);
  }
});

如果我描述这段代码,由于我们需要遍历数组中的每个对象并且需要从单独的promise添加值,因此posts.map正在创建一个promise数组。

然后Promise.all可以执行您的promise数组,并返回具有所需结果的最终结果数组。

注意:您也可以使用for … of,但是当我们需要并行进行操作时,可以使用Promise.all。您可以从此thread中找到更多信息。

这是代码沙箱的链接:https://codesandbox.io/embed/serverless-cookies-nu4h0

请注意,我添加了dummyPromiseResolverdummyEmailReturn,它们分别等于UserPost.find()Account.find()函数。除此之外,我还删除了代码中一些不必要的等待。我添加了一个try catch块来捕获任何异常。您可以根据需要更改尝试捕获。

希望这会对您有所帮助。让我知道是否需要更多说明。