WebSQL в синхронном режиме ... это возможно? - PullRequest
1 голос
/ 26 мая 2011

Я начал использовать HTML5 и WebSQL и быстро столкнулся с проблемой: все вызовы БД асинхронны.Я пришел из программирования PHP, где все вызовы являются синхронными, и я в растерянности с асинхронными вещами.

По сути, я открываю БД и запускаю запрос, который использует параметр id.переход на страницу через GET (то есть http://myserver.com/mypage.html?id=123). мне нужен результат в globalResult:

id=window.location.search.substring(1).split('=')[1];
db=openDatabase("testDB", "1.0", "Test Database", 10000000);

db.transaction(function(tx)
{
    tx.executeSql("SELECT * FROM testTable WHERE id="+id,[],successCB,errorCB);
});

function errorCB(tx,err)
{
    alert("Error processing SQL: "+err);
}

function successCB(tx,result)
{
    globalResult=result.rows.item(0)['description'];
}

...Javascript code which needs globalResult to be set...

Теперь, поскольку запрос асинхронный, интерпретатор начинает выполнять остальную часть кода перед тем, как получитьрезультаты, и, конечно, это не работает.

Есть ли какой-нибудь прием для синхронного выполнения запросов или какой-то прием для воспроизведения функций обратного вызова для решения этой проблемы?

Спасибо зазаранее, ребята:)

Ответы [ 2 ]

0 голосов
/ 02 июня 2011

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

Также я рекомендую использовать jquery-sql, что значительно упрощает код, когда дело доходит до WebSQL.

0 голосов
/ 26 мая 2011

Я на самом деле никогда не сталкивался с той же проблемой, что и вы, мой пример реализации WebSQL:

var projectName = {};
projectName.webdb = {};
projectName.webdb.db = null;
projectName.webdb.open = function() {
    projectName.webdb.db = openDatabase('Database Name', '1.0', 'description', 10 * 1024 * 1024);
}
projectName.webdb.onError = function(tx, e) {alert('Database Error: ' + e.message );}
projectName.webdb.onSuccess = function(tx, r) {}
projectName.webdb.getPeopleForExample = function() {
    projectName.webdb.db.transaction(function(tx) {
        tx.executeSql('SELECT * FROM people WHERE id=23', [], loadPeople, projectName.webdb.onError);
    });
}

function loadPeople(tx, rs) {
    for (var i=0; i < rs.rows.length; i++) {
        var name = rs.rows.item(i).name;
        var email = rs.rows.item(i).email;
        // now you do whatever you want with the data..
    }
}

Затем из любой части процедурного кода я просто вызываю
projectName.webdb.getPeopleForExample();

Я думаю, вы получите идею из примера кода:)

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