Javascript 运行异步查询并在完成后返回结果

Javascript 运行异步查询并在完成后返回结果,javascript,express,Javascript,Express,我知道这听起来应该是一个简单的谷歌来修复,但我已经旋转我的轮胎一段时间了 我正在使用MSSQL中间件将我的express应用程序连接到MSSQL数据库 它运行一个只返回“true”或“false”的存储过程,并成功地执行了该操作。我的问题是当它返回到“var login”时,当我运行它后面的代码时,实际的查询还没有返回值。控制台输出通常如下所示: 控制台 login is of type: undefined //from console.log executed after db.userLo

我知道这听起来应该是一个简单的谷歌来修复,但我已经旋转我的轮胎一段时间了

我正在使用MSSQL中间件将我的express应用程序连接到MSSQL数据库

它运行一个只返回“true”或“false”的存储过程,并成功地执行了该操作。我的问题是当它返回到“var login”时,当我运行它后面的代码时,实际的查询还没有返回值。控制台输出通常如下所示:

控制台

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()
。习惯于传递函数而不是返回值。