在javascript中foreach结束时如何执行代码



当下面的代码运行时,我期望score有一个值(比如:{" a ": 1, "B": 2}),但是当我打印它时,我得到一个空字典({})。

我试过使用承诺,但结果都是一样的。

driversBySeason(season) {
var query = `SELECT raceId FROM races WHERE year = ${season}`;
var score = {};
this.con.query(query, (err, drop) => {
if (err) {
console.error(err);
}
drop.forEach((element) => {
var raceId = element["raceId"];
query = `SELECT driverId, points FROM results WHERE raceId = ${raceId}`;
this.con.query(query, (err, drop) => {
if (err) {
console.error(err);
}
drop.forEach((element) => {
if (score[element["driverId"]] == undefined) {
score[element["driverId"]] = 0;
} else if (score[element["points"]] != undefined) {
score[element["driverId"]] += element["points"];
}
});
});
});
console.log(score);
});
}

首先,您需要将.forEach循环更改为for const of循环或只是常规的for循环,因为它只是在回调中触发代码,而不会等待它。然后你需要改变你的this.con.query(...)函数,它也有回调到承诺。你的代码应该是这样的:

const asyncQuery = (query) => new Promise((resolve, reject) => {
this.con.query(query, (err, drop) => {
if (!!err) {
console.log(error);
return reject(err)
}
return resolve(drop);
})
});

async function driversBySeason(season) {
var query = `SELECT raceId FROM races WHERE year = ${season}`;
var score = {};
const drop = await asyncQuery(query).catch(err => err /* some error handling */);
for (const element of drop) {
var raceId = element["raceId"];
query = `SELECT driverId, points FROM results WHERE raceId = ${raceId}`;
const drop2 = await asyncQuery(query).catch(err => err /* some error handling */);
drop2.forEach((element) => {
if (score[element["driverId"]] == undefined) {
score[element["driverId"]] = 0;
} else if (score[element["points"]] != undefined) {
score[element["driverId"]] += element["points"];
}
});

}
console.log(score);
}

您在回调函数之外。当它执行时,代码继续运行过&;this. conf .query&;。你看到的是在顶部赋值给这个的空对象。在drop之后进入回调。

当你调用driversBySeason时,你的分数变量的值为{}

当你调用console.log()时,这是它的值,因为close是如何工作的,你用回调函数更新分数,稍后发生的时间…

如果你用promise…不回调

最新更新