1

我的应用程序正在使用 javascript webSQL,并且我在命令执行顺序方面遇到了一些问题。无论我的代码在查询中的顺序如何,都会最后执行。例如,在以下代码中,2 将在 1 之前发出警报:

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;

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

4

2 回答 2

1

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

当页面加载了足够的内容以执行 javascript 时,将执行事件处理程序代码之外的任何内容。注意整个页面不需要加载执行alert("2"),JS就够了。由于这些语句非常接近,因此在到达并执行 alert("2") 语句之前,事务完成的可能性基本上为 0。

但是,如果您在alert("2")db.transaction(...) 和 db.transaction(...) 之间有足够的代码,则可能(在所谓的竞争条件下)回调可以在 alert(2) 代码之前执行。

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

于 2012-07-30T18:37:59.830 回答
-1

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

自 2010 年 11 月 18 日起,W3C 宣布他们已弃用 Web SQL 数据库推荐草案,并将不再维护它。

因此,虽然它目前可能在浏览器中工作,但我不会在未来依赖它。

于 2012-07-30T18:37:42.717 回答