我的应用程序正在使用 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;
有什么想法为什么会发生这种情况吗?
最佳答案
你什么时候发出警报(“2”),你还没有完成交易,所以你传递给它的第二个函数还没有被调用。由于我假设它是成功处理程序,因此它将在事务成功完成后被调用。第三个参数是查询失败时要执行的代码片段(仅当查询失败时)。
当页面加载了足够的内容来执行 JavaScript 时,就会执行事件处理程序代码之外的任何内容。请注意,执行 alert("2")
不需要加载整个页面,只需加载足够的 JS 即可。由于这些语句非常接近,因此在到达并执行alert("2") 语句之前事务完成的可能性基本上为0。
但是,如果 alert("2")
和 db.transaction(...) 之间有足够的代码,这是可能的(在所谓的竞争条件) 回调可以在alert(2) 代码之前执行。
在这种情况下,您需要小心处理事件处理程序,尽管这取决于您的成功处理程序的作用。如果它修改了页面 DOM,那么我强烈建议将 db.transaction() 和周围的代码包装在绑定(bind)到页面加载的事件处理程序中。
关于javascript - WebSQL 和 Javascript 的操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11727341/