2017-02-01 64 views
0

我知道這聽起來應該是一個簡單的谷歌修復,但我一直在旋轉我的輪胎一段時間了。運行異步查詢並返回結果一旦完成

我使用的是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,。那麼我能想到具有不給我任何實際的結果。

編輯:添加了我正在使用的實際完整代碼塊,以及澄清了我認爲正在返回一個承諾,以及什麼只是一個正常的函數調用。

+1

你的錯誤就是認爲你可以返回值。你不能返回一個值。你只能通過函數。通過返回'request'返回的承諾。execute()'(你不會返回)或直接將它傳遞給'db.userLogin()'。習慣於傳遞函數而不是返回值。 – slebetman

回答

0

如果db.userLogin()回報的承諾,你可以做到這一點

db.userLogin(activeConnection, userDetails) 
    .then(function(login) { 
    console.log(login) 
    }).catch(function(err) { 
    console.log(err); 
    }); 

db.userLogin

// ... 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; 
}); 
+1

不要做承諾反模式。這是愚蠢和低效的。 LOOK:'request.execute('loginUser')。then(...'。所以不要做'返回新的Promise(function(){request.execute()。then()...'。 request.execute()。then()'。它已經返回一個promise。不要創建不必要的promise。 – slebetman

+0

我的歉意,試圖拉出我認爲是相關的代碼,但沒有正確解釋它的其餘部分。不是Promise本身,它是request.execute,它返回了一個promise(它來自MSSQL模塊),我實現了slebetman的建議,現在「login」是類型爲「Promise」的類型。預計「Promise」已被設置爲一個值,因爲我需要在一些代碼中使用它。 – Spencel

+0

Spencel在上面的評論中,我和@slebetman提供了一個過程來讓userLogin返回一個承諾。 –

0

你需要運行console.log("login is of type: " + typeof (login));後USERLOGIN操作完成時執行回調中。所以,可能是你需要的東西是這樣的:

var login = db.userLogin(activeConnection, userDetails).then(yourCallback); 

function yourCallback(param) { 
console.log("login is of type: " + typeof (login)); 
}