首页 > 解决方案 > 数组变量的问题

问题描述

app.get("/indsalesx/:store/:mm", (req, res) => {
  connect();
  let ddd = [];
  let staffarray = [{}];
  let store = req.params.store;
  let mm = req.params.mm;
  const SP = mongoose.model(`sales${store}`, Sales);

  let num = stafflist[store].length - 1;
 
  for (i = 0; i <= num; i++) {
    let staffname = stafflist[store][i];

    let calc = 0;
    SP.find(
      { v_salesperson: stafflist[store][i], v_month: mm },
      "v_amount",
      (err, doc) => {
        let t = doc.length - 1;
        doc.map((res) => {
          calc = calc + res.v_amount;
        });
        ddd.name = staffname;
        ddd.amount = calc;
        staffarray.push(ddd);
      }
    );
  }
  console.log(staffarray);
});

我遇到的问题是:为什么 staffarray 返回一个空数组?Staffarray 被声明为一个空的对象数组,并且在循环函数中,对象被推送到数组。但是当我 console.log(staffarray) 时,它返回最初声明​​的空对象数组。

有什么帮助吗?

标签: javascriptnode.jsmongoose

解决方案


使用时find(),您可以使用 2 种方法。

  1. 传递回调函数
  2. await 函数执行并返回结果。

您似乎使用了第一种方法,这意味着您将回调传递给find()处理收到结果的方法。

console.log()代码行将在结果返回之前执行,因为它是在 for 循环之后执行的下一行。

那么,让我们来看看这里发生了什么:

  1. Javascript 正在执行find()代码行。
  2. 这行代码被放置在 Web API 中,这是浏览器中并发启动并为我们调用服务器的部分。
  3. console.log()行正在使用空数组执行(因为尚未收到结果。
  4. 一段时间后,结果回来了,回调正在回调队列中设置。
  5. JS 事件循环从回调队列中获取回调并执行它。

这是 javascript 事件循环的一部分。你可以在这里阅读更多相关信息

猫鼬文档:Model.find()


推荐阅读