对于SQL事务完成之前的循环继续

时间:2012-12-20 18:47:47

标签: javascript sql for-loop webkit

我正在处理我正在处理的数据库应用程序。在我的SQL事务完成之前,似乎我的javascript函数继续进行。下面是我正在经历的非常简化的版本。在实际的函数中,我试图在表上做一些工作,然后转到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 

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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);
    });
}