【问题标题】:NodeJS mongoose query and promiseNodeJS mongoose 查询和承诺
【发布时间】:2019-10-21 01:30:29
【问题描述】:

所以,我是 nodejs 的新手。我不只是想解决这个问题,我也想学习这个概念。

1 奖有许多获奖者。两者都是单独的表。我首先得到与某个 id 相关的奖品列表。我使用 Promises.all() 循环遍历这些奖品,然后针对每个奖品查询获奖者。

这是我的代码:

router.post("/getResult", function (req, res) {
    const lottery_id = req.body.lottery_id;
    const data = [];

    //Find list of prices for given lottery_id. Note the sorting applied here
    Prize.find({"lotid": lottery_id}).sort({name: 1})
        .then(async function (prizes) {
            try {
                await Promise.all(prizes.map(async (prize) => {
                    //Sorting here works fine as confirmed by this log.
                    console.log(prize.name);

                    await Winner.find({"id": prize._id})
                        .then(function (winners) {
                            data.push({
                                prize: prize,
                                winners: winners
                            });
                        })

                }));

                //Sorting here is completely messed up. 
                // Something wrong with second query "Winner.find() and pushing data
                res.send({success: 1, data: data});
            } catch (err) {
                console.log("Error " + err);
                res.send({success: 0, data: err});
            }


        }).catch(function (err) {
        res.send({success: 0, error: err});
    })
});

我得到的最终结果不符合应用于奖品的排序。可能是,对于二等奖的查询 Winner.find() 在一等奖之前完成,因此它在一等奖之前被推送到数据中。

【问题讨论】:

    标签: node.js mongoose promise


    【解决方案1】:

    您会看到意外的排序结果,因为您将值推送到数据数组的方式没有协调。 Prizes.map() 确实会按顺序遍历 Prizes 数组,但是,不能保证每个映射的 promise,或者更具体地说是每个 Winner.find(),都会按时间顺序以相同的顺序实现。

    解决此问题的一种方法是使用 Promise.all() 的返回值。这是一个例子:

    router.post("/getResult", async function (req, res) {
      const lottery_id = req.body.lottery_id;
    
      try {
        const prizes = await Prize.find({ "lotid": lottery_id }).sort({ name: 1 });
    
        const prizeWinners = await Promise.all(prizes.map(async function(prize) {
          const winners = await Winner.find({ "id": prize._id });
          return {
            prize,
            winners
          };
        }));
    
        res.send({ success: 1, data: prizeWinners });
      } catch (err) {
        res.send({ success: 0, error: err });
      }
    });
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 2018-01-31
      • 2016-10-25
      • 2018-05-11
      • 2014-06-24
      • 2020-12-23
      • 2015-01-21
      • 2019-09-29
      相关资源
      最近更新 更多