WebSQL в синхронном режиме … возможно ли это?

#javascript #html

#javascript #HTML

Вопрос:

Я начал использовать HTML5 и WebSQL, и я быстро столкнулся с проблемой: все вызовы DB являются асинхронными. Я пришел из 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...
  

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

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

Заранее спасибо, ребята 🙂

Ответ №1:

На самом деле я никогда не сталкивался с той же проблемой, что и вы, мой пример реализации 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();

Я думаю, вы поймете идею из примера кода 🙂

Ответ №2:

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

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

Комментарии:

1. тогда вы в конечном итоге сделали это правильно 🙂 кстати. есть синхронные перехваты, но вы все еще используете обратные вызовы, так что это не принесет вам много пользы. w3.org/TR/webdatabase/#synchronous-database-api