[英]How to execute code when foreach ends in javascript
當下面的代碼運行時,我希望 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(...)
函數,該函數也具有對 Promise 的回調。 你的代碼應該是這樣的:
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.con.query”。 您正在看到分配在頂部的空對象來執行此操作。 在您分配值的 drop.forEach 之后進入回調內部,或轉換為 async/await 方法。
當您調用 driversBySeason 時,您的 score 變量的值為 {}
這就是你調用它時 console.log() 的價值,因為關閉器是如何工作的,並且你使用稍后發生的回調函數更新分數......
如果你使用承諾,你會得到更好的理解......而不是回調
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.