如何使用异步数据库

时间:2011-10-12 19:11:34

标签: javascript html5

我有:

for (var i=0;i<2;i++) {
    dbo.transaction(
        function(myTrans) {
            myTrans.executeSql(
                'UPDATE myTable SET myField=0 WHERE myID=?'
                ,[i]
            )
        }
    )
}

因为函数是回调函数,所以使用i = 2调用它。 问:如何用i = 0和i = 1来调用它?

注意:我这就是发生了什么。我想我已经正确地说明了问题(这是因为循环结束后回调执行而引起的。)

2 个答案:

答案 0 :(得分:3)

使用匿名函数捕获变量:

for (var i=0;i<2;i++) {
    (function(i){
        dbo.transaction(
            function(myTrans) {
                myTrans.executeSql(
                    'UPDATE myTable SET myField=0 WHERE myID=?'
                    ,[i]
                )
            }
        )
    }(i));
}

答案 1 :(得分:2)

你可能对错误是什么。解决方法是在循环内部包含一个匿名函数,该函数包含一个新的,不变的i变量,供封闭的代码查看。

for (var i=0;i<2;i++) {
    (function(i) {
        dbo.transaction(
            function(myTrans) {
                myTrans.executeSql(
                    'UPDATE myTable SET myField=0 WHERE myID=?'
                    ,[i]
                );
            }
        );
    })(i);
}

ECMAScript Harmony(下一版JavaScript的提案)包括a new keyword, let,它会更清晰。它会像这样工作:

for (var i=0;i<2;i++) {
    let (i = i) {
        dbo.transaction(
            function(myTrans) {
                myTrans.executeSql(
                    'UPDATE myTable SET myField=0 WHERE myID=?'
                    ,[i]
                );
            }
        );
    }
}

甚至可以将var i替换为let i,但据我所知,目前尚未达成共识。