這是我的問題:
我需要在 Node.js 中為一個函式撰寫一個測驗,該函式從資料庫中選擇資料。它通過使用回呼函式回傳值。(代碼在下面。)
getCompanyById(id, callback) {
let company = null;
this.db.query("SELECT * FROM Company where id=?", id)
.on('result', function (data) {
company = data;
})
.on('end', function () {
callback(company);
});
}
我想在測驗功能中做的是:
- 使用所有 id(此處為 1 和 2)測驗此函式;
- 如果所有測驗都通過了,console.log("Test for getCompanyById() 已通過")。
這是我的測驗代碼的原始版本。
function testGetSchoolAdministrationById() {
var pass1,pass2;
databaseConnection.getSchoolAdministrationById(1, function (schoolAdministration) {
if(schoolAdministration.first_name == "Harald" &&
schoolAdministration.last_name == "Schmidt" &&
schoolAdministration.id_schoolAdmin == 1)
pass1=true;
}
);
databaseConnection.getSchoolAdministrationById(2, function (schoolAdministration) {
if(schoolAdministration.first_name == "Madeline" &&
schoolAdministration.last_name == "Müller" &&
schoolAdministration.id_schoolAdmin == 2)
pass2=true;
}
);
console.log("Test for getCompanyById() passed: " (pass1 && pass2));
}
但它回傳“未定義”。在網上搜索后,我意識到 Node.js 是異步的,它不會以這種方式作業。console.log("..")已經完成,而回呼還沒有。我也看過答案,比如使用另一個回呼函式來處理值。但就我而言,我有 2 個回呼,但不知道該怎么做。
所以這是我的問題:
有沒有什么方法可以在
testGetSchoolAdministrationById()不改變功能的情況下實作功能的目標getCompanyById(id, callback)?(因為這對其他代碼影響相當大。)1.如果問題是不可能的,有什么方法可以達到目的,同時功能
getCompanyById(id, callback)可以改變嗎?換句話說,有沒有更好的方法來實作getCompanyById(id, callback)不使用回呼的相同目標?或者,也許測驗框架會對此有所幫助?我沒有使用任何測驗框架,因為我沒有嘗試過,而且我對這些框架不太熟悉。
這是我關于 Node.js 的第一個專案,所以我對上面提到的任何概念都不是很有信心。因此,歡迎任何建議和答案。由于這也是我關于堆疊溢位的第一個問題,因此也歡迎對問題/標題/結構提出任何建議。希望,我清楚地描述了這一點。我真的很想弄清楚這一點。
uj5u.com熱心網友回復:
您的意思是在測驗完成后記錄字串?
那么你必須使用嵌套的回呼來按照你想要的順序進行。
因此,在完成 db 檢查中的第一個 id 后,繼續在第一個 id 回呼中進行下一個 id 檢查。
function testGetSchoolAdministrationById() {
var pass1,pass2;
databaseConnection.getSchoolAdministrationById(1, function (schoolAdministration) {
if(schoolAdministration.first_name == "Harald" &&
schoolAdministration.last_name == "Schmidt" &&
schoolAdministration.id_schoolAdmin == 1){
pass1=true;
databaseConnection.getSchoolAdministrationById(2, function (schoolAdministration) {
if(schoolAdministration.first_name == "Madeline" &&
schoolAdministration.last_name == "Müller" &&
schoolAdministration.id_schoolAdmin == 2){
pass2=true;
console.log("Test for getCompanyById() passed: " (pass1 && pass2));
}
else {
console.log("Test for getCompanyById() passed: " (pass1 && pass2));
}
}
);
}
else {
console.log("Test for getCompanyById() passed: " (pass1 && pass2));
}
}
);
}
uj5u.com熱心網友回復:
您可以通過使用Promises輕松實作這一點。
一種方法是使用 async/await 關鍵字。
async function testGetSchoolAdministrationById() {
try {
const pass1 = await new Promise((resolve) => {
databaseConnection.getSchoolAdministrationById(1, function(schoolAdministration) {
resolve(schoolAdministration.first_name == "Harald" &&
schoolAdministration.last_name == "Schmidt" &&
schoolAdministration.id_schoolAdmin == 1);
});
}),
pass2 = await new Promise((resolve) => {
databaseConnection.getSchoolAdministrationById(2, function(schoolAdministration) {
resolve(schoolAdministration.first_name == "Madeline" &&
schoolAdministration.last_name == "Müller" &&
schoolAdministration.id_schoolAdmin == 2);
})
});
console.log("Test for getCompanyById() passed: " (pass1 && pass2));
} catch (e) {
console.error(e);
}
}
或者Promise.all(arrPromises).then(results)打電話
function testGetSchoolAdministrationById() {
Promise.all([new Promise((resolve) => {
databaseConnection.getSchoolAdministrationById(1, (schoolAdministration) => {
resolve(schoolAdministration.first_name == "Harald" &&
schoolAdministration.last_name == "Schmidt" &&
schoolAdministration.id_schoolAdmin == 1);
});
}), new Promise((resolve) => {
databaseConnection.getSchoolAdministrationById(2, (schoolAdministration) => {
resolve(schoolAdministration.first_name == "Madeline" &&
schoolAdministration.last_name == "Müller" &&
schoolAdministration.id_schoolAdmin == 2);
})
})]).then(([pass1, pass2]) => {
console.log("Test for getCompanyById() passed: " (pass1 && pass2));
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/373340.html
標籤:javascript 节点.js 测试 打回来
