【问题标题】:How to use mongoose function inside of loop in JS如何在 JS 的循环中使用猫鼬函数
【发布时间】:2019-11-10 01:02:33
【问题描述】:

我正在使用“request-promise”模块从某些 API 获取数据。
这将数组值作为主体。
我想将该数组保存为 mongoDB 中的每个文档。
因此,我用'for'作为循环。
但是当我用 console.log 检查这个时,
我希望像下面一样。

Current i is : 0
orderFind
Current i is : 1
orderFind
Current i is : 2
orderFind
Current i is : 3
orderFind

但它给了我

Current i is : 0
Current i is : 1
Current i is : 2
Current i is : 3
orderFind
orderFind
orderFind
orderFind

我尝试了异步,也尝试了等待。但是效果不好..

exports.saveOrder = (req, res) => {
  rp({
    method: "GET",
    uri: "https://robot.com",
    json: true
  }).then(body => {
    for (let i = 0; i < body.length; i += 1) {
      console.log(`Current i is : ${i}`);
      const eachBody = body[i];

      Order.findOne(
        {
          order_id: eachBody.order_id
        },
        (err, exOrder) => {
          console.log("orderFind");
          if (err) {
            return res.send(err);
          }
        }
      );
    }
  });
};

【问题讨论】:

  • 为什么要日志是这个命令?它不会改变 findOne 的结果

标签: node.js


【解决方案1】:

检查此代码,使用async/await可以解决问题

exports.saveOrder = (req, res) => {
  rp({
    method: "GET",
    uri: "https://robot.com",
    json: true
  }).then(async body => {
    for (let i = 0; i < body.length; i += 1) {
      console.log(`Current i is : ${i}`);
      const eachBody = body[i];
      try {
        const result = await Order.findOne({ order_id: eachBody.order_id });
        console.log(result);
      } catch (e) {
        return res.send(e);
      }
    }
  });
};

【讨论】:

    【解决方案2】:

    您可以将 Promiseasyncawait 一起使用

    exports.saveOrder = (req, res) => {
      rp({
        method: "GET",
        uri: "https://robot.com",
        json: true
      }).then(async body => {
        for (let i = 0; i < body.length; i += 1) {
          console.log(`Current i is : ${i}`);
          const eachBody = body[i];
          const { order, err } = await findOrder(eachBody);
          if (err) {
            res.send(err);
          }
          console.log("Order found:", order._id);
        }
      });
    };
    
    function findOrder() {
      return new Promise(resolve => {
        Order.findOne(
          {
            order_id: eachBody.order_id
          },
          (err, exOrder) => {
            resolve({
              order: exOrder,
              err
            });
          }
        );
      });
    }
    

    如果你想获得更多关于 async/await 和 Promise 的详细信息,并可能异步执行多个请求,我建议你检查 this article

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2017-06-04
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多