當下面的代碼運行時,我希望 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);
});
}
uj5u.com熱心網友回復:
首先,您需要將.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);
}
uj5u.com熱心網友回復:
你在你的回呼之外。當它執行時,代碼繼續運行通過“this.con.query”。您正在看到分配在頂部的空物件來執行此操作。在您分配值的 drop.forEach 之后進入回呼內部,或轉換為 async/await 方法。
uj5u.com熱心網友回復:
當您呼叫 driversBySeason 時,您的 score 變數的值為 {}
這就是你呼叫它時 console.log() 的價值,因為關閉器是如何作業的,并且你使用稍后發生的回呼函式更新分數......
如果你使用承諾,你會得到更好的理解......而不是回呼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/494814.html
標籤:javascript 节点.js
