6

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

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

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

于 2009-06-21T03:37:40.363 回答