这真的是异步还是发生得如此之快以至于没有什么区别?

时间:2011-11-30 22:32:52

标签: javascript sqlite webdb

我正在尝试编写一种在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函数的参数中指定回调,但这意味着我必须使用回调递归调用它,如果我使用空匿名函数,它似乎会覆盖所需的回调。

所以我猜两个问题:首先,这是否真的同步;第二,如何实现最终回调以在堆栈的最后一个回调上运行?

编辑:将代码更新为更新版本。但是,第一个问题仍然存在:这是真正的同步吗?

1 个答案:

答案 0 :(得分:0)

在代码中放置alert()setTimeout(),以测试它们是同时执行还是分开。这通常是测试它的好方法。如果所有代码同时执行(异步),那么您将立即隐藏10个警报 - 否则每x秒会得到一个。

关于第二个问题:只检查堆栈是否为空。你可能不得不通过你的函数传递第三个变量。除非您在全局范围内定义变量,否则它不会被覆盖。