我正在尝试写一种在WebDB环境中同步执行一组sqlite查询的方法。我已经提出了我认为相当于同步例程的内容,但是我不确定如何对其进行测试。这是我所拥有的:
var db = openDatabase("test1", "1.0", "test", 5 * 1024 * 1024);
function synchronousSql(tx, sqlStack, callback) {
if (sqlStack.length !== 0) {
var q = sqlStack.shift();
console.log(+new Date() + ' ' + q);
tx.executeSql(q, [], synchronousSql(tx, sqlStack, callback), null);
} else {
callback();
}
}
var seq = [
'drop table if exists table1',
'drop table if exists table2',
'drop table if exists table3',
'drop table if exists table4',
'drop table if exists table5',
'create table table1(id integer, value text)',
'create table table2(id integer, value text)',
'create table table3(id integer, value text)',
'create table table4(id integer, value text)',
'create table table5(id integer, value text)',
'drop table if exists table1',
'drop table if exists table2',
'drop table if exists table3',
'drop table if exists table4',
'drop table if exists table5'
];
db.transaction(function(tx) {
synchronousSql(tx, seq, function() {
console.log(+new Date() + ' - from synchronousSql callback');
});
}, null, function() {
console.log(+new Date() + ' - from transaction callback');
});
在纸上(我认为),它应该起作用。看着它,我认为我的警报消息将在执行最终语句时弹出,而不一定在返回时弹出,但我不确定如何解决。我尝试在我的
synchronousSql
函数的参数中指定一个回调,但这意味着我必须用一个回调递归调用它,如果我使用一个空的匿名函数,它似乎会覆盖所需的回调。所以我想两个问题:第一,这真的是同步的吗?第二,如何实现最终回调以在堆栈的最后一个回调上运行?
编辑:将代码更新为最新版本。但是,第一个问题仍然存在:这真的是同步的吗?
最佳答案
将alert()
和setTimeout()
放入代码中,以测试它们是否同时执行还是分开执行。通常,这是一种很好的测试方法。如果所有代码同时(异步)执行,那么您将立即隐藏10条警报-否则每x ms收到一条警报。
关于第二个问题:只需检查堆栈是否为空。不过,您可能必须通过函数传递第三个变量。除非您在全局范围内定义变量,否则它将不会被覆盖。
关于javascript - 这真的是异步的吗?还是发生得如此之快以至于没有什么不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8333931/