每次第二个count
循环退出后,我的计数器forEach
都会重置,但这并不意味着要重置,因为当我在第二个循环内进行控制台日志时,数字是正确的,但是没有运气。
let arr = [];
var count;
result.forEach(server => {
count = 0;
sql.query(`SELECT * FROM users WHERE server='${server.server}';`, async (error, results) => {
if (error) {
console.log(error);
}
results.forEach(user => {
if(user.key_deactivated == 'false') {
count++;
}
});
console.log(count);
});
arr.push({
server: server.server,
name: server.name,
plan_id: server.plan_id,
mb_stripe: server.mb_stripe,
description: server.description,
key_stock: server.key_stock,
channel: server.channel,
active: count
});
});
res.render('pages/administrator', {result: result, user: req.user, arr: arr});
答案 0 :(得分:1)
您正在使用回调函数,而回调函数是异步行为的一部分。意味着js将其推送到回调队列中,以便稍后执行。因此在回调可以更改之前先访问计数值。
let arr = [];
var count;
result.forEach(server => {
count = 0;
sql.query(`SELECT * FROM users WHERE server='${server.server}';`, async (error, results) => {
if (error) {
console.log(error);
}
results.forEach(user => {
if(user.key_deactivated == 'false') {
count++;
}
});
console.log(count);
arr.push({
server: server.server,
name: server.name,
plan_id: server.plan_id,
mb_stripe: server.mb_stripe,
description: server.description,
key_stock: server.key_stock,
channel: server.channel,
active: count
});
res.render('pages/administrator', {result: result, user: req.user, arr: arr});
});
});
有关回调的更多信息,请查看此内容。 https://developer.mozilla.org/en-US/docs/Glossary/Callback_function
答案 1 :(得分:0)
欢迎使用callback hell。
“放弃所有希望,进入这里的人们。”
但丁·阿利吉耶里
对问题的较不诗意的描述是您正在使用回调,并希望它们在代码之后的代码之前执行。但这不是他们的工作方式。让我解释一下您的代码的作用:
迭代结果,并为每个实例将count
设置为0,并异步等待查询执行,并在等待查询执行的同时,不实际等待查询执行,而是推送对象(包含{{ 1}})到count
。但是arr
尚未刷新,查询仍在执行。只需输入这段代码
count
恰好在您的 arr.push({
server: server.server,
name: server.name,
plan_id: server.plan_id,
mb_stripe: server.mb_stripe,
description: server.description,
key_stock: server.key_stock,
channel: server.channel,
active: count
});
之后。