有没有办法使用Node.js中两个回调函数的值(布尔值)



这是我的问题:

我需要在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);
});
}

我想在测试功能中做的是:

  1. 用所有id测试此函数(此处为1和2(
  2. 如果所有测试都通过了,那么console.log("TestforgetCompanyById((passed"(

这是我的测试代码的原始版本。

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("..")已经完成,而回调尚未完成。我还看到了Answers,比如使用另一个回调函数来处理值。但在我的情况下,我有两个回调,不知道如何做。

所以我的问题是:

  1. 有什么方法可以在不改变函数getCompanyById(id, callback)的情况下实现函数testGetSchoolAdministrationById()的目标吗?(因为这对其他代码有很大的影响。(

  2. 如果1。问题是不可能的,有什么方法可以实现目标,而函数getCompanyById(id, callback)可以更改吗?换句话说,有没有更好的方法可以在不使用回调的情况下实现getCompanyById(id, callback)的相同目标?

  3. 或者,测试框架可能会对此有所帮助?我没有使用任何测试框架,因为我没有尝试过,我也不太熟悉这些。

这是我关于Node.js的第一个项目,所以我对上面提到的任何概念都不太有信心。因此,欢迎任何建议和答案。由于这也是我关于堆栈溢出的第一个问题,因此也欢迎对问题/标题/结构提出任何建议。希望如此,我描述得很清楚。我真的很想弄清楚。

您的意思是在测试完成后记录字符串?

好吧,你必须使用嵌套的回调来按照你想要的顺序进行。

所以,在数据库中的第一个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));
}
}
);

}

使用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));
});
}

相关内容

  • 没有找到相关文章

最新更新