Как работать с асинхронной базой данных - PullRequest
1 голос
/ 12 октября 2011

У меня есть:

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

Поскольку функция является обратным вызовом, она вызывается с i = 2.Q: Как мне назвать это с i = 0 и i = 1?

Примечание: я думаю , что происходитЯ думаю, что я правильно сформулировал проблему (она вызвана тем, что обратный вызов выполняется после завершения цикла).

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Используйте анонимную функцию для захвата переменной:

for (var i=0;i<2;i++) {
    (function(i){
        dbo.transaction(
            function(myTrans) {
                myTrans.executeSql(
                    'UPDATE myTable SET myField=0 WHERE myID=?'
                    ,[i]
                )
            }
        )
    }(i));
}
2 голосов
/ 12 октября 2011

Возможно, вы правы насчет ошибки.Решение этой проблемы заключается в том, чтобы обернуть анонимную функцию внутри цикла, которая содержит новую и неизменную переменную 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) включает в себя новое ключевое слово, 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, но, насколько я знаю, консенсус по этому вопросу еще не достигнут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...