我正在使用以下代码
var Year12=new Array();
GetYear(function(Year12)
{
alert(Year12);
});
function GetYear(callback)
{
var selectAllStatement = "SELECT DISTINCT year FROM mytable";
var db = openDatabase("Postit", "1.0", "Notebook", 200000);
var dataset;
alert("1");
db.transaction(function(tx) {
alert("2");
tx.executeSql(selectAllStatement, [], function(tx, result)
{
alert("3");
dataset = result.rows;
for (var i = 0, item = null; i < dataset.length; i++)
{
item = dataset.item(i);
Year12[i]=item['year'];
}
callback(Year12);
});
});
}
这里没有执行tx.executeSql语句意味着警报3没有显示。有没有办法做到这一点
答案 0 :(得分:2)
db.transaction
和tx.executeSql
调用是异步的,因此回调函数。这意味着GetYear
将完成执行并返回,之后 tx.executeSql
回调将填充您的Year12
数组。
一旦你有异步行为和回调,唯一明智的解决方案当然是更多的回调。你需要一个更像这样的结构:
function GetYear(callback) {
//...
db.transaction(function(tx) {
//...
tx.executeSql(selectuniqueyearStatement, [], function(tx, result) {
var Year12 = [ ];
//... populate the locale Year12 using result.rows
callback(Year12);
});
});
}
然后像这样使用它:
GetYear(function(year12) {
// Do whatever you need to do with the year12 array...
});
基本上与AJAX调用使用的代码结构和策略相同。