Порядок работы WebSQL и Javascript

Мое приложение использует javascript webSQL, и у меня возникли проблемы с порядком выполнения команд. Независимо от того, в каком порядке мой код находится в запросах, они выполняются последними. Например, в следующем коде 2 будут предупреждены до 1:

db.transaction(
        function (transaction) {
        transaction.executeSql(
        'SELECT * FROM contacts WHERE id = ?;',
        [id],
        function (transaction, result) {
           alert("1");
           if (result.rows.length != 0) {
            user = result.rows.item(0).name;
           } else {}
        },
        errorHandler);
    });

alert("2");
message = id + '%1E' + name;

Любые идеи, почему это происходит?


person ewein    schedule 30.07.2012    source источник
comment
Транзакция для SQL, вероятно, является асинхронным вызовом, тогда как alert("2") является следующим вызовом функции и выполняется немедленно.   -  person TheZ    schedule 30.07.2012


Ответы (2)


Когда вы предупреждаете («2»), вы не завершили транзакцию, поэтому вторая функция, которую вы передаете ей, не была вызвана. Поскольку я предполагаю, что это обработчик success, он будет вызван после успешного завершения транзакции. Третьим аргументом будет фрагмент кода, который будет выполняться в случае сбоя запроса, только в случае сбоя.

Все, что находится за пределами кода обработчика событий, выполняется, когда на странице загружено достаточно контента для выполнения javascript. Обратите внимание, что для выполнения alert("2") не нужно загружать всю страницу, достаточно JS. Поскольку эти операторы очень близки друг к другу, вероятность того, что транзакция когда-либо будет завершена до того, как будет достигнуто и выполнено предупреждение ("2"), практически равно нулю.

Однако, если у вас достаточно кода между alert("2") и db.transaction(...), возможно (в так называемом состоянии гонки) обратный вызов может быть выполнен до кода alert(2) .

В этом случае вы должны быть осторожны с обработчиками событий, хотя это зависит от того, что делает ваш обработчик успеха. Если он изменяет DOM страницы, то я настоятельно рекомендую обернуть db.transaction() и окружающий код обработчиком событий, привязанным к загрузке страницы.

person Kasapo    schedule 30.07.2012

Это не ответ на ваш вопрос, но я подумал, что должен предупредить вас о webSQL.

По состоянию на 18 ноября 2010 г. W3C объявил, что они устарели от проекта рекомендации по базе данных Web SQL и больше не будут его поддерживать.

Поэтому, хотя на данный момент он может РАБОТАТЬ в браузерах, я бы не стал полагаться на него в будущем.

person Andrew McGivery    schedule 30.07.2012
comment
Да, я знаю это, однако, насколько я понимаю, Chrome и Safari сохранят его, просто не добавят никаких новых функций, и меня пока это устраивает. Будет легко переключиться на indexedDatabase, как только его поддержат другие браузеры. - person ewein; 30.07.2012