Javascript 从回调中获取值
我使用module for node.js,通过游标从表中获取值,如下所示:Javascript 从回调中获取值,javascript,node.js,sqlite,Javascript,Node.js,Sqlite,我使用module for 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
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对象,但我想得到语句。得到函数结果,我如何从回调中得到col值?你只能在调用回调后使用该值
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
您只能在调用回调后使用该值
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
原因是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);
}
原因是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);
}
您的问题是您正在运行非阻塞呼叫。因此,在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);
这样做的问题是你根本不知道什么时候返回。你的问题是你正在运行一个非阻塞呼叫。因此,在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);
这样做的问题是,您根本不知道返回的内容何时会返回。阅读您的评论,您可能希望以这种方式修改代码:
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);
}
阅读您的注释时,您可能希望通过以下方式修改代码:
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);
}
谢谢您的回答,但我需要在代码的另一部分获取statement.get函数之后的值…您无法执行此操作,因为在回调返回之前该值不存在。。。解决方案是在回调函数的hanks for answer中创建逻辑,但我需要在代码的另一部分获取statement.get函数后的值…yo不能这样做,因为在回调返回之前,该值不存在。。。解决方案是基于回调创建逻辑,或者您可以推荐另一个同步sqlite3 nodejs模块吗?或者您可以推荐另一个同步sqlite3 nodejs模块吗?