Javascript 从回调中获取值

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

我使用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我得到了空的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模块吗?