如何让以下JavaScript返回row
,以便我可以在事务外访问它?所有Apple的示例代码似乎都在事务中将HTML写入浏览器,而不是将数据传递回调用函数。
遵循:
function getData() {
db.transaction(function(tx) {
tx.executeSql("SELECT id FROM table LIMIT 1", [], function(tx, result) {
row = result.rows.item(0);
}, function(tx, error) {
});
});
return row;
}
这甚至可能吗? Webkit存储API可以设置为同步而不是异步执行吗?
答案 0 :(得分:5)
我认为你想在这里创建一个闭包,因为在你访问它们之前,值被垃圾收集/移出范围链。将row
传递给闭包以便稍后访问,或者传递给其他一些可以在值仍在范围内时处理该值的函数。
答案 1 :(得分:5)
我意识到这是一个非常古老的问题,但我在搜索如何处理JavaScript异步SQLite调用时发现了它。问题和我的问题一样,我找到了一个更好的答案(扩展所选答案,使用闭包)
我的getData函数版本如下:
function get_option (option, get_option_callback){
if (db === null){
open_database();
}
db.transaction(function (tx) {
tx.executeSql("SELECT rowid,* FROM app_settings WHERE option = ? ", [option],
function(tx, result){
item = result.rows.item(0);
get_option_callback(item.value);
return;
}
}, sql_err);
});
}
然后调用我将使用的方法:
get_option("option name", function(val){
// set the html element value here with val
// or do whatever
$('input[name="some_input"]').val(val);
});
答案 2 :(得分:0)
我在http://wecreategames.com/blog/?p=219
写了一个关于这个和其他SQL事务的例子您必须以异步方式执行WebKit executeSql调用。要解决这个问题,你应该拥有:
function(tx, error) {
}
执行某些操作来更新您的数据。类似的东西:
function(tx, results) {
console.log("Results returned: "+results.rows.length);
for (var i=0; i<results.rows.length; i++) {
var row = results.rows.item(i);
document.getElementById('latestUpdated').innerHTML = row;
}
}
请注意,函数中的第二个变量不是错误,而是结果。
我放入一个for循环来显示可能会返回多个结果(可能不会使用该SQL语句) - 所以希望你能看到它的效用。