#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