【问题标题】:Wait for mongoose.find inside foreach loop inside callback在回调中等待 foreach 循环中的 mongoose.find
【发布时间】:2020-08-04 10:21:10
【问题描述】:

如何等到data 填充到finalresult 之后再继续? 我尝试了 async 和 await 但没有按预期工作,最重要的是我是 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" });
  }
};

【问题讨论】:

  • 我不知道 Mongoose,.exec(...) 会返回一个承诺吗?
  • @sp00m umm 然后我们可以像Design.find() .select("_id sm lm") .where("_id") .in(oelement.items) .exec((err, orders) => { finalresult.push(orders); console.log(orders); }); 一样使用它,然后它也不会填充发送给用户的最终结果
  • @sp00m 我不太确定它返回的承诺有点与这部分混淆:(
  • 最好的通常是查看文档:mongoosejs.com/docs/api.html#query_Query-exec ;)
  • 所以我猜你必须和Promise#all一起玩。你能清理你的代码以便更容易提供帮助吗?例如,我可以看到许多未使用或未声明的变量,它确实会污染读数。

标签: node.js express async-await


【解决方案1】:

exec() 函数确实返回了 Promise,所以你可以使用 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",
        });
    }
}

您始终可以在 for ..of 循环中使用 async/await 调用异步函数。你可以阅读更多here

附:无法运行代码。如果您有任何疑问,请告诉我 :)

【讨论】:

  • 最后,上面的代码适用于我想要实现的目标,我想现在我知道正确的用法也异步和等待谢谢:)
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多