NodeJS мангуст запрос и обещание - PullRequest
0 голосов
/ 05 июня 2019

Итак, я новичок в nodejs. Я не просто хочу решить эту проблему, но я также хочу изучить эту концепцию.

1 приз имеет много победителей. Оба являются отдельными таблицами. Сначала я получаю список призов, связанных с определенным идентификатором. Я перебираю эти призы с помощью 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 () для 2-го приза заканчивается до 1-го приза и, следовательно, он помещается в данные до 1-го приза.

1 Ответ

0 голосов
/ 05 июня 2019

Вы видите неожиданный отсортированный результат, потому что нет никакой координации с тем, как вы помещаете значения в массив данных.prizes.map () выполняет итерацию по массиву призов последовательно, однако нет гарантии, что каждое сопоставленное обещание или, более конкретно, каждый Winner.find () будет выполнено в том же порядке в хронологическом порядке.

OneВы можете исправить это, используя возвращаемое значение 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 });
  }
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...