我正在嘗試使用promise來調用getLoginState,然後存儲該值,以便稍後使用它。爲什麼這個嵌套promise,然後在承諾的方法之前執行?
我想知道爲什麼在下面的代碼塊中,q.fcall(getLoginState)裏面的.then在getLoginState方法之前被調用?
var mysql = require('mysql');
var q = require('q');
var login = "tyler";
var connection = mysql.createConnection({
host : 'localhost',
user: 'root',
password: 'root',
port: '3306',
database: 'root'
});
var gotLoginState;
var state;
connection.connect(function(err) {
if(err != null){
console.log("connection err: "+err);
}
q.nfcall(connection.query.bind(connection),"SELECT id, password, salt, gender, banned, gm, pin, pic, characterslots, tos FROM accounts WHERE name = ?",[login])
.then(function (results) {
console.log("select: "+results[0][0]);
// }).then(q.fcall(getLoginState), function() {
q.fcall(getLoginState)
.then(function() {
console.log("gotLoginState: " + state);
}).catch(function (error){
console.log("error in inner thing");
}).done();
}).catch(function (error) {
console.error("promise error: "+error);
})
.done();
});
var accId = 1;
var getLoginState = function() {
q.nfcall(connection.query.bind(connection), "SELECT loggedin, lastlogin, UNIX_TIMESTAMP(birthday) as birthday FROM accounts WHERE id = ?", [accId])
.then(function (results) {
state = results[0][0].loggedin;
}).catch(function (error) {
console.log("error in chaining: "+error);
}).done();
};
有一點需要注意(我不能確定這是否是代碼中的問題)是,在爲其賦值之前,您可能會引用'getLoginState'。這就是爲什麼我不使用'var getLoginState = function(){'定義一個函數的形式,除非它是必需的。如果你使用'function getLoginState(){'來代替它,它會被掛起並且總是被定義,然後才能使用它。 – jfriend00
@ jfriend00承諾保證在異步循環的某些未來時間內執行並且從不同步 - 因此在這種情況下它不是問題。 –