我有以下代码获取json记录集并在客户端Web Sql存储上的三个不同表中插入一些数据。
如何拦截databaseSync()函数的结束? 我想要做的是显示一个警报或更好的ajax微调器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);
});
});
});
}
答案 0 :(得分:12)
好的,这是我的第五次修订,但我喜欢这个问题而且我不断提出更好的想法。这个使用jquery deferred objects,我认为它最终涵盖了所有案例,并按照应有的方式运作。
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,以便在执行其他任何操作后执行resolve函数作为回调函数,然后这应该适合您。我希望你觉得这很有用。
答案 1 :(得分:-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);
}