API базы данных HTML5: синхронный запрос - PullRequest
7 голосов
/ 29 октября 2010

В настоящее время я использую базу данных на стороне клиента в веб-приложении html5 iphone.В моем коде мне нужно проверить, есть ли строка в локальной БД:

function isStarted(oDB) {
 var ret = null;
 oDB.query(sql,params,function(transaction,result) {
    if(result.rows.length > 0 ) {
        ret = true;
    } else {
        ret = false;
    }
 });

return ret;

}

К сожалению, возвращение isStarted () происходит до функции обратного вызова, и я всегда получаю«нулевое» значение.В W3c spec мы видим «синхронный-database-api», но как я могу его использовать?Есть ли хитрость, чтобы получить хорошее значение "ret" с помощью асинхронных заданий?

Спасибо за вашу помощь

Ответы [ 3 ]

8 голосов
/ 23 декабря 2010

Я единственный, кто посчитал этот асинхронный запрос смешным? Более того, кажется, что Safari прямо сейчас реализует только асинхронную модель ... Интересно, как мы эффективно кодируем подобное ...

Мне бы понравилась любая ссылка на серьезное программирование с драйвером async db.

8 голосов
/ 29 октября 2010

Чтобы получить объект, реализующий DatabaseSync, вам нужно вызвать openDatabaseSync(...) вместо openDatabase(...). Я не знаю об iPhone или о том, какой у вас объект oDB, но согласно спецификации вы получаете метод openDatabaseSync только в WebWorker, а не в обычном веб-браузере window. Безусловно, XMLHttpRequest продемонстрировал, что синхронные операции потенциально длинной в потоке пользовательского интерфейса не очень хорошая идея.

Невозможно запустить асинхронный код синхронно или наоборот. Для этого вам потребуются функции уровня языка, такие как потоки или сопрограммы, которых нет в JavaScript. Вы должны выйти из своих функций и вернуть управление браузеру, чтобы он мог выполнить HTTP-запрос или запрос к базе данных, и перезвонить вам на обработчик, который вы ему дали.

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

function tellMeWhenIsStarted(oDB, callback) {
    oDB.query(sql,params,function(transaction,result) {
        callback(result.rows.length>0);
    }
});
0 голосов
/ 20 ноября 2011

Вы должны заблокировать следующее выполнение, когда вы намерены получить результаты синхронно. Цена, которую вы должны заплатить, - это блокировка пользовательского интерфейса во время выполнения.

var ret = null;
var finished = false;

cfunction isStarted(oDB) {
         oDB.query(sql,params,function(transaction,result) {
                ret = result;
                finished = true;
         });

    while(!finished){
    ;//block next execution, while result is being fetched
    }
    return ret;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...