HTML5 WebSQL: как узнать, когда заканчивается транзакция db?
У меня есть следующий код, который получает набор записей json и вставляет некоторые данные в три разные таблицы на клиентском хранилище Web Sql.
Как я могу перехватить конец функции databaseSync()?
Что я хочу сделать, так это показать предупреждение или улучшить ajax spinner gif, чтобы сообщить пользователю о завершении синхронизации.
Большое спасибо за вашу помощь,
чао!
function databaseSync() {
// table one
$.getJSON("http://192.168.1.40:8888/iOS/mobilesrv/index.php?ACT=one", function(json) {
$.each(json.results, function(i, res) {
db.transaction(function(tx) {
tx.executeSql("INSERT INTO table1 (A, B, C, D) VALUES (?,?,?,?) ", [res.A, res.B, res.C, res.D], onSuccess, onError);
});
});
});
// table two
$.getJSON("http://192.168.1.40:8888/iOS/mobilesrv/index.php?ACT=two", function(json) {
$.each(json.results, function(i, res) {
db.transaction(function(tx) {
tx.executeSql("INSERT INTO table1 (A, B, C, D) VALUES (?,?,?,?) ", [res.A, res.B, res.C, res.D], onSuccess, onError);
});
});
});
// table three
$.getJSON("http://192.168.1.40:8888/iOS/mobilesrv/index.php?ACT=three", function(json) {
$.each(json.results, function(i, res) {
db.transaction(function(tx) {
tx.executeSql("INSERT INTO table1 (A, B, C, D) VALUES (?,?,?,?) ", [res.A, res.B, res.C, res.D], onSuccess, onError);
});
});
});
}
Ответы
Ответ 1
Хорошо, это моя пятая ревизия, но мне этот вопрос понравился, и я продолжаю придумывать лучшие идеи. Этот использует jquery отложенные объекты, и я думаю, что он, наконец, охватывает все случаи и работает так, как должен.
function tableInsert(url) {
var dfd = $.Deferred();
var arr = [];
$.getJSON(url, function(json) {
$.each(json.results, function(i, res) {
var dfd = $.Deferred();
arr.push(dfd.promise());
db.transaction(function(tx) {
tx.executeSql(
"INSERT INTO table1 (A, B, C, D) VALUES (?,?,?,?) ",
[res.A, res.B, res.C, res.D],
function(){
onSuccess(dfd.resolve);
},
function(){
onError(dfd.resolve);
}
);
});
});
$.when.apply(this, arr).then(dfd.resolve);
});
return dfd.promise();
}
function databaseSync() {
$.when( tableInsert("http://192.168.1.40:8888/iOS/mobilesrv/index.php?ACT=one"),
tableInsert("http://192.168.1.40:8888/iOS/mobilesrv/index.php?ACT=two"),
tableInsert("http://192.168.1.40:8888/iOS/mobilesrv/index.php?ACT=three"))
.then(function(){
console.log( 'All processing complete' );
});
}
Для этого вам нужно будет изменить onSuccess и onError, чтобы выполнить функцию разрешения как функцию обратного вызова после выполнения всего, что она делает, и тогда это должно работать на вас. Надеюсь, вы сочтете это полезным.
Ответ 2
В качестве альтернативы вы можете использовать одну транзакцию для массовой вставки и использовать функцию обратного вызова для получения уведомления о завершении транзакции
function doSync(){
databaseSync(function(){
console.log('database sync is completed')
});
}
function databaseSync(onTrxSuccess) {
db.transaction(function(tx) {
// table one
$.getJSON("http://192.168.1.40:8888/iOS/mobilesrv/index.php?ACT=one", function(json) {
$.each(json.results, function(i, res) {
tx.executeSql("INSERT INTO table1 (A, B, C, D) VALUES (?,?,?,?) ", [res.A, res.B, res.C, res.D], onSuccess, onError);
});
});
// table two
$.getJSON("http://192.168.1.40:8888/iOS/mobilesrv/index.php?ACT=two", function(json) {
$.each(json.results, function(i, res) {
tx.executeSql("INSERT INTO table1 (A, B, C, D) VALUES (?,?,?,?) ", [res.A, res.B, res.C, res.D], onSuccess, onError);
});
});
// table three
$.getJSON("http://192.168.1.40:8888/iOS/mobilesrv/index.php?ACT=three", function(json) {
$.each(json.results, function(i, res) {
tx.executeSql("INSERT INTO table1 (A, B, C, D) VALUES (?,?,?,?) ", [res.A, res.B, res.C, res.D], onSuccess, onError);
});
});
}, null, onTrxSuccess);
}