Node.js中两个回调函数的值(布尔值)有什么办法可以使用吗?
Is there any way to use the values(Boolean) of two Callback functions in Node.js?
这是我的问题:
我需要在 Node.js 中为一个函数编写一个测试,select 来自数据库的数据。它 returns 使用回调函数的值。(代码在下面。)
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("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));
}
但它 returns“未定义”。网上一搜,才知道Node.js是Asynchrony,这样是行不通的。 console.log("..")
已经完成,而回调还没有。我也看过答案,比如使用另一个回调函数来处理值。但就我而言,我有 2 个回调,但不知道该怎么做。
所以这是我的问题:
有没有办法在不改变getCompanyById(id, callback)
功能的情况下,达到testGetSchoolAdministrationById()
功能的目的?(因为这对其他代码影响比较大。)
如果1.问题不可以,请问有什么办法既可以达到目的,又可以改变功能getCompanyById(id, callback)
?换句话说,有没有更好的方法可以在不使用回调的情况下实现 getCompanyById(id, callback)
相同的目标?
或者测试框架可能对此有所帮助?我没有使用任何测试框架,因为我没有尝试过,而且我对这些框架并不熟悉。
这是我关于 Node.js 的第一个项目,所以我对上面提到的任何概念都不是很有信心。所以欢迎任何建议和答案。由于这也是我关于 Stack overflow 的第一个问题,因此也欢迎任何有关 questions/title/structure 的建议。希望,我已经清楚地描述了这一点。我真的很想弄清楚这个。
您的意思是在测试完成后记录字符串?
好吧,你必须使用嵌套回调来按照你想要的顺序进行。
因此,在完成第一个 id in db 检查后,在第一个 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));
});
}
这是我的问题:
我需要在 Node.js 中为一个函数编写一个测试,select 来自数据库的数据。它 returns 使用回调函数的值。(代码在下面。)
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("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));
}
但它 returns“未定义”。网上一搜,才知道Node.js是Asynchrony,这样是行不通的。 console.log("..")
已经完成,而回调还没有。我也看过答案,比如使用另一个回调函数来处理值。但就我而言,我有 2 个回调,但不知道该怎么做。
所以这是我的问题:
有没有办法在不改变
getCompanyById(id, callback)
功能的情况下,达到testGetSchoolAdministrationById()
功能的目的?(因为这对其他代码影响比较大。)如果1.问题不可以,请问有什么办法既可以达到目的,又可以改变功能
getCompanyById(id, callback)
?换句话说,有没有更好的方法可以在不使用回调的情况下实现getCompanyById(id, callback)
相同的目标?或者测试框架可能对此有所帮助?我没有使用任何测试框架,因为我没有尝试过,而且我对这些框架并不熟悉。
这是我关于 Node.js 的第一个项目,所以我对上面提到的任何概念都不是很有信心。所以欢迎任何建议和答案。由于这也是我关于 Stack overflow 的第一个问题,因此也欢迎任何有关 questions/title/structure 的建议。希望,我已经清楚地描述了这一点。我真的很想弄清楚这个。
您的意思是在测试完成后记录字符串?
好吧,你必须使用嵌套回调来按照你想要的顺序进行。
因此,在完成第一个 id in db 检查后,在第一个 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));
});
}