Как установить статус с помощью HTML5 Web Database api - PullRequest
0 голосов
/ 08 июля 2010

Я использую API веб-базы данных HTML5, и у меня есть функция, которая проверяет, нужно ли приложению перейти на этап настройки:

this.setupRequired = function() {
    var status;
    try {
        this.db.transaction(function(tx) {
            tx.executeSql("SELECT * FROM settings", [], function (tx,result) {
                if (result.rows.length == 0) {
                    status =  true;
                } else {
                  status = false;
                }
            }, function(tx) {
                status = true;
            })
        });
    } catch (e) {
        return true;
    }
    return status
}

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

Ответы [ 3 ]

0 голосов
/ 08 июля 2010

Вы, вероятно, могли бы установить статус как свойство объекта или другого объекта вашего собственного создания.

Вы также можете проверить на каждом этапе, что это такое и какое значение имеет статус, используя firebug.

0 голосов
/ 08 июля 2010

Я хотел бы вернуть true или false в зависимости от того, есть данные в таблице настроек или нет

Вы не можете.Не известно, есть ли данные в таблице настроек в то время, когда должен возвращаться метод setupRequired().Это будет известно только тогда, когда база данных SQL выполнила запрос и запустила функцию обратного вызова.Это происходит только после того, как setupRequired() и все функции, которые привели к его вызову, вышли, вернув управление браузеру.

В этом весь смысл функции обратного вызова, передаваемой executeSql().Функция не выполняется сразу, поэтому к моменту достижения return status прикосновение к status не будет затронуто.Более того, любые исключения, возникающие внутри функций обратного вызова, не приведут к выполнению блока catch(e), потому что блок try...catch будет долго завершен к моменту фактического вызова функции, которая была определена внутри него.Так что это try...catch фактически бесполезно.

Это «асинхронное» кодирование.То, что какой-то код находится ниже функции, не означает, что функция будет выполняться первой.

0 голосов
/ 08 июля 2010

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

this.setupRequired = function() {
    try {
        this.db.transaction(function(tx) {
            tx.executeSql("SELECT * FROM settings", [], function (tx,result) {
                if (result.rows.length == 0) {
                    doYourSetupFunction();
                } else {
                  //don't;
                }
            }, function(tx) {
                doYourSetupFunction();
            })
        });
    } catch (e) {
        doYourSetupFunction();
    }
}

Так что функция setupRequired отвечает за проверку и запуск установки.

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