这真的是异步的吗?或者它发生得太快了,没有什么区别

Is this really asynchronous or does it happen so fast it doesn't make a difference?

本文关键字:区别 什么 异步 真的 或者      更新时间:2023-09-26

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

我想有两个问题:首先,这真的是同步的吗?第二,我如何实现一个最后的回调来运行在堆栈的最后一个回调?

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

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

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