2013-11-21 53 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); 
}