我知道這聽起來應該是一個簡單的谷歌修復,但我一直在旋轉我的輪胎一段時間了。運行異步查詢並返回結果一旦完成
我使用的是MSSQL中間件到我的快遞應用程序連接到一個MSSQL數據庫。
它運行一個存儲過程,直接返回「真」或「假」,它成功地做。我的問題是,當它返回到「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 protected]";
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;
});
我是嘗試有var登錄包含由userLogin方法返回的「true」或「false」。
USERLOGIN僅僅是一個正常的功能,它不是一個承諾(我承諾的理解是很不穩定的,所以我不相信關於它是否被實際返回承諾)。
從我閱讀的文檔和試驗中,request.execute(...)返回一個承諾,這就是爲什麼我使用「.then」後運行代碼。但是,在「.then」函數中,它似乎返回返回,尚未分配「真」或「假」。 VAR登錄也被顯示爲未定義時,它的類型被打印出來
我知道它是與承諾,但回報的每個組合,.catch,。那麼我能想到具有不給我任何實際的結果。
編輯:添加了我正在使用的實際完整代碼塊,以及澄清了我認爲正在返回一個承諾,以及什麼只是一個正常的函數調用。
你的錯誤就是認爲你可以返回值。你不能返回一個值。你只能通過函數。通過返回'request'返回的承諾。execute()'(你不會返回)或直接將它傳遞給'db.userLogin()'。習慣於傳遞函數而不是返回值。 – slebetman