Подождите mon goose .find внутри foreach l oop внутри обратного вызова - PullRequest
1 голос
/ 04 августа 2020

Как мне подождать, пока data не будет заполнено в finalresult, прежде чем идти дальше? Я пробовал asyn c и ожидал, но не работал должным образом, и, кроме того, я новичок в nodejs express

exports.getporderlist = (req, res) => {
  page = req.params.page || "1";
  skip = (page - 1) * 10;
  if (req.profile.role.includes(1)) {
    Order.find({ status: { $in: [0, 2] } })
      .select("_id updatedAt items salesman")
      .populate("customer", "customer_name phone")
      .sort({ updatedAt: -1 })
      .skip(skip)
      .limit(10)
      .exec((err, orders) => {
        if (err) {
          return res.status(400).json({
            error: "No Orders found",
          });
        }

        let finalresult = [];

        orders.forEach((oelement) => {
          total = 0;
          salesman = oelement.salesman.split(" ")[0];
          itemscount = oelement.items.length;
          placeorder = true;
          oelement.items.forEach((element) => {
            total += element.price * element.quantity;
          });
          //Wait for the bellow data variable to finish populating finalresult 
          const data = Design.find()
            .select("_id sm lm")
            .where("_id")
            .in(oelement.items)
            .exec((err, orders) => {
              finalresult.push(orders);
              console.log(orders);
            });
});
        console.log(1);
        res.json(finalresult);//getting empty finalresult array on call
      });
  } else {
    res.json({ Message: "Go away" });
  }
};

1 Ответ

1 голос
/ 04 августа 2020

Функция exec() действительно возвращает обещание, поэтому вы можете вызвать ее пользователем async/await. Ваш код будет выглядеть так:

exports.getporderlist = async (req, res) => {
    try {
        if (req.profile.role.includes(1)) {
            page = Number(req.params.page) || 1;
            skip = (page - 1) * 10;
            const orders = await Order.find({
                    status: {
                        $in: [0, 2]
                    }
                })
                .select("_id updatedAt items salesman")
                .populate("customer", "customer_name phone")
                .sort({
                    updatedAt: -1
                })
                .skip(skip)
                .limit(10)
                .exec();
            let finalresult = [];

            for (const oelement of orders) {
                let total = 0;
                salesman = oelement.salesman.split(" ")[0];
                itemscount = oelement.items.length;
                placeorder = true;
                oelement.items.forEach((element) => {
                  total += element.price * element.quantity;
                });

                const data = await Design.find()
                    .select("_id sm lm")
                    .where("_id")
                    .in(oelement.items)
                    .exec();
                finalresult.push(data);
            }
            res.json(finalresult);

        } else {
            res.json({
                Message: "Go away"
            });
        }
    } catch (err) {
        return res.status(400).json({
            error: "No Orders found",
        });
    }
}

вы всегда можете вызывать асинхронные c функции с async/await внутри for ..of циклов. Подробнее здесь

Ps Не удалось запустить код .. Дайте знать, если есть сомнения :)

...