我对node.js使用sqlite3模块,我从带有光标的表中获取值,如下所示:
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-object,但我想得到 statement.get 函数结果,我怎样才能从回调中得到col值?< / p>
答案 0 :(得分: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
答案 1 :(得分: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 :(得分: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);
});
没有理由将temp设置为空对象,因为col无论如何都会覆盖它,所以只需将它声明为变量就可以了。我要做的就是不设置温度,只需使用col。
但是如果你绝对需要按照你的方式去做,你可能想要以黑客的方式做到并设置超时:
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);
这样做的问题在于你根本不知道返回什么时候会回来。
答案 3 :(得分: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);
}