【问题标题】:getting a Webkit executeSql transaction to return a value获取 Webkit executeSql 事务以返回值
【发布时间】:2010-10-18 22:31:15
【问题描述】:

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

【问题讨论】:

标签: javascript sqlite webkit


【解决方案1】:

我认为您想在这里创建一个闭包,因为在您可以访问它们之前,值正在被垃圾收集/从作用域链中移出。将row 传递给闭包以供稍后访问,或者传递给其他可以处理仍在作用域内的值的函数。

更多信息:Working With Closures

【讨论】:

  • 我很想看看你将如何做到这一点(我的意思是通过闭包)。我尝试了很多次,但没有任何效果。
【解决方案2】:

我意识到这是一个非常古老的问题,但我在搜索如何处理 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);
});

【讨论】:

    【解决方案3】:

    我在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 语句)——因此希望您能看到它的实用性。

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      相关资源
      最近更新 更多