2012-07-30 122 views
1

我的应用程序使用JavaScript webSQL,并且遇到命令执行顺序的问题。无论我的代码在查询中的最后执行顺序如何。例如,在下面的代码中,2将在1之前提醒:WebSQL和Javascript操作顺序

db.transaction(
     function (transaction) { 
     transaction.executeSql(
     'SELECT * FROM contacts WHERE id = ?;', 
     [id], 
     function (transaction, result) { 
      alert("1"); 
      if (result.rows.length != 0) { 
      user = result.rows.item(0).name; 
      } else {} 
     }, 
     errorHandler); 
    }); 

alert("2"); 
message = id + '%1E' + name; 

任何想法为什么会发生这种情况?

+1

SQL的事务可能是异步调用,而alert(“2”)是下一个函数调用并立即运行。 – TheZ 2012-07-30 18:28:37

回答

1

你什么时候提醒(“2”),你还没有完成交易,所以你传递给它的第二个函数还没有被调用。由于这是我假设的success处理程序,它将在事务成功完成后调用。第三个参数是查询失败时执行的代码片段,仅当失败时才执行。

事件处理程序代码之外的任何内容都会在页面加载足够的内容以执行javascript时执行。请注意,整个页面不需要加载执行alert("2"),只是足够的JS。由于这些语句非常接近,因此在达到并执行警报(“2”)语句之前,交易完成的基本机会是0。

然而,如果你alert("2")和db.transaction(...)之间有足够的代码,很可能(在所谓的竞态条件)回调可以在警报(2)代码之前执行。

在这种情况下,您希望小心事件处理程序,但它取决于您的成功处理程序的功能。如果它修改页面DOM,那么我强烈建议将db.transaction()和周围的代码包装在绑定到页面加载的事件处理程序中。

-1

这不是你的问题的答案,但我想我应该给你一个关于webSQL的警告。

截至2010年11月18日,W3C宣布已弃用Web SQL数据库推荐草案,不再维护它。

所以,虽然它目前可能在浏览器中工作,但我不会依赖它来做未来的事情。

+0

是的,我知道这一点,但是从我的理解中,Chrome和Safari会保持它不添加任何新功能,现在对我来说会很好。一旦更多浏览器支持它,将很容易切换到indexedDatabase。 – ewein 2012-07-30 18:38:54

+0

webstorage怎么样? http://www.w3.org/TR/webstorage/ – Kasapo 2012-07-30 18:39:29