6

row次の JavaScript を返して、トランザクション外でアクセスできるようにするにはどうすればよいですか? 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 を非同期実行ではなく同期実行に設定できますか?

4

3 に答える 3

5

値にアクセスする前に、値がガベージコレクションされたり、スコープチェーンから移動されたりするため、ここでクロージャを作成する必要があると思います。後でアクセスするためにクロージャに渡すrowか、スコープ内にある間に値を処理できる他の関数に渡します。

詳細:クロージャーの操作

于 2009-04-11T18:38:46.533 に答える
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);
});
于 2012-10-19T14:04:10.637 に答える
0

これと他の SQL トランザクションの例をhttp://wecreategames.com/blog/?p=219に書きました。

非同期スタイルで 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;
   } 
}

関数の 2 番目の変数はエラーではなく、結果であることに注意してください。

複数の結果が返される可能性があることを示すために for ループを挿入しました (ただし、おそらくその SQL ステートメントではそうではありません)。

于 2009-06-21T03:37:40.363 に答える