2013-11-21 51 views
0

值我用sqlite3模塊的node.js和我得到的值從表遊標,就像這樣:獲取從回調

db = new sqlite3.Database(config.sqlite3config.path); 

statement = db.prepare("SELECT * FROM test_table"); 

var temp = {}; 
statement.get(function(err, col) { 
    temp = col; 
}); 

console.log(temp); 

最後的console.log我得到空的JS對象,但我想要得到statement.get函數結果,我怎麼能從回調中獲取col值?

+0

或者你能recommented另一同步sqlite3的模塊的NodeJS? – user3012872

回答

1

的原因是因爲DB調用是異步的 - 所以當你console.log命中,該命令尚未完成。你有幾個選擇,1)。做你的工作在該命令的回調函數:

statement.get(function(err, col) { 
    temp = col; 
    //do stuff! 
}); 

2)使用一個回調函數,並傳遞數據到它:

statement.get(function(err, col) { 
    temp = col; 
    callback(temp); 
}); 

function callback(param) { 
    console.log(param); 
} 
2

你只能使用該值調用回調後...

db = new sqlite3.Database(config.sqlite3config.path); 

statement = db.prepare("SELECT * FROM test_table"); 

var temp = {}; 
statement.get(function(err, col) { 
    temp = col; 
    console.log(tempo); // here works!... 
    //do your code here! 
}); 

console.log(temp); //here isn't work 
+0

感謝您的回答,但我需要在代碼的另一部分statement.get函數後得到值... – user3012872

+0

喲不能這樣做,因爲在回調返回之前該值不存在...解決方法是創建基於回調的邏輯 –

0

你的問題是,你正在運行一個無阻塞呼叫。所以在db調用返回之前,temp仍然是一個空對象。

這裏是你想要做什麼:

var db = new sqlite3.Database(config.sqlite3config.path), 
    temp; 

statement = db.prepare("SELECT * FROM test_table"); 

statement.get(function(err, col) { 
    temp = col; 
    console.log(temp); 
}); 

沒有理由設定溫度爲空對象,因爲山坳無論如何都會被覆蓋,所以只需要聲明它作爲一個變量,你會好。我會做的是甚至不設置溫度,只是使用列。

,但如果你確實需要做到這一點,你沒有,你可能想要做一個黑客,安永的方式,並設置了超時:

db = new sqlite3.Database(config.sqlite3config.path); 

statement = db.prepare("SELECT * FROM test_table"); 

var temp = {}; 
statement.get(function(err, col) { 
    temp = col; 
}); 

setTimeout(function() { 
    console.log(temp); 
}, 20); 

用做這種方式的問題是,你有不知道什麼時候回報會回來,如果有的話。

0

讀你的意見,你可能需要修改你的代碼是這樣的:

db = new sqlite3.Database(config.sqlite3config.path); 

statement = db.prepare("SELECT * FROM test_table"); 

statement.get(doSomethingElse); 

function doSomethingElse(err, temp) { 
    // your code here 
    console.log(temp); 
}