javascript - 数组变量的问题
问题描述
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) 时,它返回最初声明的空对象数组。
有什么帮助吗?
解决方案
使用时find()
,您可以使用 2 种方法。
- 传递回调函数
- await 函数执行并返回结果。
您似乎使用了第一种方法,这意味着您将回调传递给find()
处理收到结果的方法。
console.log()
代码行将在结果返回之前执行,因为它是在 for 循环之后执行的下一行。
那么,让我们来看看这里发生了什么:
- Javascript 正在执行
find()
代码行。 - 这行代码被放置在 Web API 中,这是浏览器中并发启动并为我们调用服务器的部分。
- 该
console.log()
行正在使用空数组执行(因为尚未收到结果。 - 一段时间后,结果回来了,回调正在回调队列中设置。
- JS 事件循环从回调队列中获取回调并执行它。
这是 javascript 事件循环的一部分。你可以在这里阅读更多相关信息
猫鼬文档:Model.find()
推荐阅读
- javascript - Javascript:为什么函数返回时数组长度加倍?
- python - 使用 Uncompyle6 反编译 PYC 文件得到 AssertionError
- data-binding - Blazor 嵌套子级更新子级,但父级不会立即更新
- java - 具有数据库名称参数的构造函数
- azure - Gatling index.html 报告在发布后无法在 AZure Devops 中正确加载
- java - 有没有办法从堆栈底部反转后半部分元素(使用递归)?
- javascript - java servlet从外部事件调用网页中的javascript弹出/模式对话框
- google-play - Google Play / Apple App Store 购买政策
- python - 基于来自 one-hot 编码列的多个条件的子集数据帧
- java - 为什么 java.util.Calendar 在 2021 年 2 月返回 31?