异步等待所有承诺

时间:2019-12-01 14:02:27

标签: node.js async-await sequelize.js

我想知道我是否在异步等待中正确使用了promise.all。

基本上,我需要根据ID获取房屋数据,然后需要获取该房屋的所有评论以及评论计数。

  server.get("/api/houses/:id", async (req, res) => {
    const { id } = req.params;
    const house = await House.findByPk(id);
    if (!house) {
      return res.status(400).send("No house found");
    }

    const reviews = await Review.findAndCountAll({
      where: {
        houseId: house.id
      }
    });

    house.dataValues.reviewsCount = reviews.count;

    const results = await Promise.all([house.dataValues, reviews.rows]);
    console.log(results);
    res.send(results);
  });

在前端,当我在发出http请求后console.log响应时,我得到了下面的内容,因为Promise.all为您提供了数组。但是我不知道这是最好的方法还是更好的方法。

[
  {
    id: 2329,
    host: 2,
    picture: '/img/houses/1.jpg',
    type: 'Entire house',
    town: 'Some town',
    title: 'Some title',
    price: 50,
    description: 'Some description',
    guests: 4,
    bedrooms: 1,
    beds: 2,
    baths: 1,
    wifi: true,
    reviewsCount: 2
  },
  [
    {
      id: 1,
      houseId: 2329,
      userId: 1,
      comment: 'An awesome review',
      createdAt: '2019-01-11T22:00:00.000Z',
      updatedAt: '2019-01-11T22:00:00.000Z'
    },
    {
      id: 2,
      houseId: 2329,
      userId: 2,
      comment: 'Another awesome review',
      createdAt: '2019-01-11T22:00:00.000Z',
      updatedAt: '2019-01-11T22:00:00.000Z'
    }
  ]
]

2 个答案:

答案 0 :(得分:1)

您没有正确使用Promise.all。该代码有效,因为您要分别await兑现每个诺言。

由于Review.findAndCountAll取决于House.findByPk的结果,因此Promise.all在这里将无济于事。

您正在将Promise.all与两个promise的已解析值一起使用,因此可以将其删除。

 server.get("/api/houses/:id", async (req, res) => {
    const { id } = req.params;
    const housePromise = await House.findByPk(id);


    const reviews = await Review.findAndCountAll({
      where: {
        houseId: house.id
      }
    });

    house.dataValues.reviewsCount = reviews.count;

    res.send([house.dataValues, reviews.rows]);
 });

基本上你在做:

const res = await Promise.all([1, 5]); // [1, 5]

可以直接翻译为:

const res = [1, 5];

与发送数组相比,我认为发送对象更好:

{
   house: house.dataValues,
   reviews: reviews.rows
}

答案 1 :(得分:1)

您可以忽略async await并使用Promise。您可以尝试使用以下代码

server.get("/api/houses/:id", async (req, res) => {
   const { id } = req.params;

   return House.findByPk(id)
     .then( house => {
        // !house might be 'true' if house is 'undefined'
        if( house === undefined || !house ) {
           return res.status(400).send("No house found");
        }

        return Review.findAndCountAll({ where: {  houseId: house.id } })
           .then(reviews => {
              house.dataValues.reviewsCount = reviews.count;
              return {house, reviews};
           })
           .catch(error => res.send(error));
      })
      .then( result => {
         return res.send(results);
      })
      .catch(error => {
          return res.send(error);
      });
   })