0

私は次のコードを使用しています

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が表示されていないことを意味します。これを行う方法はありますか

4

1 に答える 1

2

db.transactionとのtx.executeSql呼び出しは非同期であるため、コールバック関数が使用されます。つまり、コールバックが配列にデータを入力する前にGetYear、実行が終了して戻ります。tx.executeSqlYear12

非同期の動作とコールバックができたら、当然のことながら、唯一の賢明な解決策はコールバックを増やすことです。次のような構造が必要です。

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 呼び出しで使用するのと同じコード構造と戦略です。

于 2012-08-09T06:20:50.093 に答える