получение транзакции WebSit executeSql для возврата значения - PullRequest
6 голосов
/ 11 апреля 2009

Как я могу получить следующий JavaScript для возврата row, чтобы я мог получить к нему доступ вне транзакции? Весь пример кода Apple, кажется, имеет HTML, записанный в браузер в транзакции, вместо того, чтобы когда-либо передавать данные обратно вызывающей функции.

В соответствии с:

function getData() {
  db.transaction(function(tx) {
    tx.executeSql("SELECT id FROM table LIMIT 1", [], function(tx, result) {
      row = result.rows.item(0);
    }, function(tx, error) {
    });
  });

  return row;
}

Это вообще возможно? Можно ли настроить API хранилища Webkit на синхронное, а не на асинхронное выполнение?

Ответы [ 3 ]

5 голосов
/ 19 октября 2012

Я понимаю, что это очень старый вопрос, но я нашел его, когда искал способ обработки асинхронных вызовов SQLite в JavaScript. И вопрос такой же, как у меня, и я нашел лучший ответ (Расширяет выбранный ответ, используя замыкания)

Моя версия вашей функции getData выглядит следующим образом:

function get_option (option, get_option_callback){
    if (db === null){
       open_database();
    }
    db.transaction(function (tx) {
        tx.executeSql("SELECT rowid,* FROM app_settings WHERE option = ? ", [option],            
        function(tx, result){
            item = result.rows.item(0);
            get_option_callback(item.value);
            return;
         }
       }, sql_err);
   });
}

Затем, чтобы вызвать метод, я бы использовал:

get_option("option name", function(val){
 // set the html element value here with val
 // or do whatever
 $('input[name="some_input"]').val(val);
});
5 голосов
/ 11 апреля 2009

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

Дополнительная информация: Работа с замыканиями

0 голосов
/ 21 июня 2009

Я написал пример этой и других транзакций SQL по адресу: http://wecreategames.com/blog/?p=219

Вы должны выполнять вызовы WebSit executeSql в асинхронном стиле. Чтобы обойти это, вы должны иметь:

function(tx, error) {
}

выполнить что-то для обновления ваших данных. Что-то вроде:

function(tx, results) {
   console.log("Results returned: "+results.rows.length);
   for (var i=0; i<results.rows.length; i++) {
      var row = results.rows.item(i);
      document.getElementById('latestUpdated').innerHTML = row;
   } 
}

Обратите внимание, что вторая переменная в функции - это не ошибка, это результаты.

Я добавил цикл for, чтобы показать, что может быть возвращено несколько результатов (возможно, не с этим оператором SQL) - так что, надеюсь, вы увидите его полезность.

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