获取Webkit executeSql事务以返回值

时间:2009-04-11 17:53:43

标签: javascript sqlite webkit

如何让以下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可以设置为同步而不是异步执行吗?

3 个答案:

答案 0 :(得分:5)

我认为你想在这里创建一个闭包,因为在你访问它们之前,值被垃圾收集/移出范围链。将row传递给闭包以便稍后访问,或者传递给其他一些可以在值仍在范围内时处理该值的函数。

更多信息:Working With Closures

答案 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语句) - 所以希望你能看到它的效用。