我的应用程序正在使用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;
为什么会发生这种情况的任何想法?
答案 0 :(得分:1)
你什么时候警告(“2”),你还没有完成交易,所以你传递给它的第二个功能还没有被调用。因为它是我假设的success
处理程序,所以在事务成功完成后将调用它。第三个参数是查询失败时要执行的代码片段,仅当它失败时才会执行。
当页面加载了足够的内容来执行javascript时,会执行事件处理程序代码之外的任何内容。请注意,整个页面无需加载即可执行alert("2")
,只需足够的JS。由于这些语句非常接近,因此在达到并执行警报(“2”)语句之前,事务将完全有机会完成。
但是,如果在alert("2")
和db.transaction(...)之间有足够的代码,则可以(在所谓的竞争条件中)可以执行回调在警报(2)代码之前。
在这种情况下,您需要小心使用事件处理程序,尽管这取决于您的成功处理程序的作用。如果它修改了页面DOM,那么我强烈建议将db.transaction()和周围的代码包装在绑定到页面加载的事件处理程序中。
答案 1 :(得分:-1)
这不是你问题的答案,但我想我应该给你一个关于webSQL的警告。
截至2010年11月18日,W3C已宣布已弃用Web SQL数据库推荐草案,不再维护它。
因此,虽然目前它可能在浏览器中运行,但我不会在将来依赖它。