Вложенный веб-SQL-запрос HTML5, выданный после обработки всего цикла For - PullRequest
0 голосов
/ 08 марта 2012

В этом запросе, указанном ниже, цикл for выполняет 4 значения. В первом оповещении (id) оно оповещает о тех 4 различных значениях. Однако во вложенном запросе оператор оповещения выводит только последнее значение id, 4x с различными значениями max (b.id). Я не совсем понимаю. Кто-нибудь знает, что может происходить? Может ли быть состояние гонки?

Моя цель - разместить Ajax-вызов во вложенном запросе, который имеет входные значения, основанные на id и b.id. В настоящее время я делаю это, но значение в вызове ajax для «id» одинаково для всех 4 различных вызовов, что портит возвращаемые данные. Спасибо.

database.db.transaction(function (tx) {
            tx.executeSql('SELECT id, name from programs d', [], function (tx, results) {
                for (var i = 0; i < results.rows.length; i++) {
                    var id = results.rows.item(i)['id'];
                    var name = results.rows.item(i)['name'];
                        alert(id);

                    tx.executeSql('SELECT max(b.id) + 1 max from people b where b.sid = ?',
                        [id],
                        function (tx, results) {
                            lastRecord = results.rows.item(0)['max'];
                            alert(id + "last rec: " + name);
                        }
                    );
                }
            },
            function (event) { alert(event.message); });

1 Ответ

2 голосов
/ 09 марта 2012

Согласно моим комментариям, вы должны вернуть закрытую функцию для правильного связывания параметра.

Гораздо более простым примером является следующее:

При выполнении этого выдается 4 предупреждения, все из которых показывают 4:

for (i=0;i<4;i++) {
    setTimeout( function() { alert(i)}, 1000);
}

При выполнении этого выдает 4 предупреждения, показывая 0/4, 1/4, 2/4, 3 / 4.

for (i=0;i<4;i++) {
    setTimeout(function(inneri) { 
        return( 
            function() { 
                alert(inneri + "/" + i);
            }
        );
    }(i), 1000);
}

, где я назвал inneriзначение, которое было сохранено при закрытии.Обратите внимание, что i сам по-прежнему ссылается на внешнюю область и, следовательно, равен 4 (что является истинным во время выполнения, поскольку это значение i, когда оно выгружается из цикла for, так как мы откладываемвыполнение с использованием setTimeout().

Первый случай - более простая версия того, что вы делаете, в то время как вам нужен второй вариант.

Переписывает ваши js (и надеется, что я получу все это (и {в нужном месте :)) дает:

database.db.transaction(function (tx) {
      tx.executeSql('SELECT id, name from programs d', [], function (tx, results) {
            for (var i = 0; i < results.rows.length; i++) {
                var id = results.rows.item(i)['id'];
                var name = results.rows.item(i)['name'];
                alert(id);

                tx.executeSql('SELECT max(b.id) + 1 max from people b where b.sid = ?',
                    [id],
                    function(innerId) { 
                       return (
                          function (tx, results) {
                                lastRecord = results.rows.item(0)['max'];
                                alert(innerId + "last rec: " + name);
                          }
                       );
                    }(id) //be careful to avoid the ";" here!
                );
            }
        },
        function (event) { alert(event.message); 
    });

Где я вставил:

 function(innerId) { 
    return (
         function (tx, results) {
             lastRecord = results.rows.item(0)['max'];
             alert(innerId + "last rec: " + name);
         }
    );
 }(id)

in. Эта функция вызывается сразу через (id) и возвращаетфункция, которая принимает tx и results в качестве аргументов и выполняет соответствующее действие.

Я проверил фигурные скобки / скобки, но у меня нет прямого способа проверить, что я не сделал опечаток.

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