Javascript 运行异步查询并在完成后返回结果
我知道这听起来应该是一个简单的谷歌来修复,但我已经旋转我的轮胎一段时间了 我正在使用MSSQL中间件将我的express应用程序连接到MSSQL数据库 它运行一个只返回“true”或“false”的存储过程,并成功地执行了该操作。我的问题是当它返回到“var login”时,当我运行它后面的代码时,实际的查询还没有返回值。控制台输出通常如下所示: 控制台Javascript 运行异步查询并在完成后返回结果,javascript,express,Javascript,Express,我知道这听起来应该是一个简单的谷歌来修复,但我已经旋转我的轮胎一段时间了 我正在使用MSSQL中间件将我的express应用程序连接到MSSQL数据库 它运行一个只返回“true”或“false”的存储过程,并成功地执行了该操作。我的问题是当它返回到“var login”时,当我运行它后面的代码时,实际的查询还没有返回值。控制台输出通常如下所示: 控制台 login is of type: undefined //from console.log executed after db.userLo
login is of type: undefined //from console.log executed after db.userLogin is called
returned is: true
路线
userdetails = {};
userdetails.username = "username";
userdetails.email = "email@email.test";
userDetails = JSON.stringify(userDetails);
var login = db.userLogin(activeConnection, userDetails);
console.log("login is of type: " + typeof (login));
db.userLogin
module.exports.userLogin = function (activeConnection, loginDetails) {
loginDetails = JSON.parse(loginDetails);
var username = loginDetails.username;
var password = loginDetails.password;
var email = loginDetails.email;
var returned = "";
var request = new sql.Request(activeConnection);
request.input('username', sql.NVarChar(50), username);
request.input('password', sql.NVarChar(50), password);
request.execute('loginUser').then(function (recordsets) {
console.log(recordsets[0].length);
returned = recordsets[0][0].UserExists;
console.log("returned is: " + returned);
return returned;
});
// ... code
return request.execute('loginUser').then(function (recordsets) {
console.log(recordsets[0].length);
var returned = recordsets[0][0].UserExists;
console.log("returned is: " + returned);
return returned;
});
我试图让var login包含userLogin方法返回的“true”或“false”
userLogin只是一个普通的函数,它不是承诺(我对承诺的理解非常不稳定,所以我不确定它是否真的返回了承诺)
从我对文档的阅读和实验来看,request.execute(…)返回一个承诺,这就是为什么我在之后使用“.then”来运行代码的原因。但是,在“.then”函数中,它似乎返回了返回的,尚未将其指定为“真”或“假”var login在打印其类型时也显示为未定义
我知道这与承诺有关,但我所能想到的每一种回报组合,.catch,.then都没有给我任何真正的结果
编辑:添加了我正在使用的实际完整代码块,以及关于我认为返回承诺的内容的澄清,以及什么只是正常的函数调用。您需要运行
console.log(“登录类型:+typeof(login))。所以你可能需要这样的东西:
var login = db.userLogin(activeConnection, userDetails).then(yourCallback);
function yourCallback(param) {
console.log("login is of type: " + typeof (login));
}
如果db.userLogin()
返回承诺,您可以这样做
db.userLogin(activeConnection, userDetails)
.then(function(login) {
console.log(login)
}).catch(function(err) {
console.log(err);
});
db.userLogin
module.exports.userLogin = function (activeConnection, loginDetails) {
loginDetails = JSON.parse(loginDetails);
var username = loginDetails.username;
var password = loginDetails.password;
var email = loginDetails.email;
var returned = "";
var request = new sql.Request(activeConnection);
request.input('username', sql.NVarChar(50), username);
request.input('password', sql.NVarChar(50), password);
request.execute('loginUser').then(function (recordsets) {
console.log(recordsets[0].length);
returned = recordsets[0][0].UserExists;
console.log("returned is: " + returned);
return returned;
});
// ... code
return request.execute('loginUser').then(function (recordsets) {
console.log(recordsets[0].length);
var returned = recordsets[0][0].UserExists;
console.log("returned is: " + returned);
return returned;
});
不要做反模式的承诺。这既愚蠢又低效。查看:request.execute('logiuser')。然后(…
。所以不要返回新的承诺(函数(){request.execute()。然后()…
。只需执行返回request.execute()。然后()
。它已经返回了一个承诺。不要创建不必要的承诺。很抱歉,我尝试提取了我认为相关的代码,但没有正确解释其余部分。userLogin本身不是承诺,而是请求。execute返回了一个承诺(来自MSSQL模块)。我实现了slebetman的建议,现在“login”是“Promise”类型。我以前在这里有过它,但我希望“Promise”已经被设置为一个值,因为我需要在紧接着的一些代码中使用它。Spencel在上面的评论中,我和@slebetman提供了一个过程,使userLogin返回一个承诺。@Tiephan:。然后()
返回一个承诺。承诺就是这样工作的。谢谢你们的回答和详细信息/澄清!你们的错误是认为你们可以返回一个值。你们不能返回一个值。你们只能传入函数。或者通过返回由request.execute()返回的承诺(顺便说一句,你们没有返回)或者直接将其传递到db.userLogin()
。习惯于传递函数而不是返回值。