2

我正在处理的数据库应用程序遇到一些问题。似乎我的 javascript 函数在我的 SQL 事务完成之前继续进行。下面是我所经历的一个非常简化的版本。在实际函数中,我试图在移至 for 循环中的下一个值之前对表做一些工作。它似乎在 for 循环中做所有事情,然后完成 SQL 事务。

这是示例代码:

function fillTables(){
    db.transaction(function (tx){
        for(var i=0; i<3; i++){
            console.log('Filling row '+i);
            tx.executeSql(
                        'INSERT INTO Numbers (Value) VALUES (?)',
                        [i],
                        function (){
                            console.log('Inserted Row');    
                        },
                        errorCB);
            console.log('moving on...');
        }
    });
}

我希望看到的控制台日志是:

Filling Row 0
Inserted Row
moving on...
Filling Row 1
Inserted Row
moving on... 
Filling Row 2
Inserted Row
moving on... 

但是,我得到:

Filling row 0 
moving on... 
Filling row 1 
moving on... 
Filling row 2 
moving on... 
Inserted Row 
Inserted Row 
Inserted Row 

关于如何实现预期结果的任何想法?

4

2 回答 2

1

tx.executeSql()是一个异步函数,并且行为适当。我将为您寻找同步方法并编辑我的回复。

因此,根据我所阅读的内容,该功能仅由于 HTML5 规范而异步。此外,如果您以某种方式同步运行它,它将返回“无效状态”错误。

于 2012-12-20T18:54:29.817 回答
0

tx.executeSql() 是一个异步函数,在这种情况下,您需要在函数完成后执行递归调用。

function fillTables() {
    db.transaction(function (tx){
        var recursiveFunction = function (index, length) {
            if (index < length) {
                console.log('Filling row ' + index);
                tx.executeSql(
                    'INSERT INTO Numbers (Value) VALUES (?)',
                    [index],
                    function (){
                        console.log('Inserted Row');
                        console.log('moving on...');
                        recursiveFunction(++index, length);    
                    },
                    errorCB);
             }
        }

        recursiveFunction(0, 3);
    });
}
于 2012-12-20T19:00:57.947 回答