道歉,但我好像是围成一圈。
这个过程非常明确
SaveButtonClicked
调用函数执行脱机db事务以更新记录
检查是否在线(/ *使用Ed Norton示例执行此操作* /)
如果在线调用select transaction以获取所有更新的记录
选择加载结果成功到数组
使用数组
在测试控制台时总是在'building array'之前写'array built'
var arrvals = [];
var deferA , deferB;
function updatedb(params){
db.transaction('update....',[params],updateOk,updateFail)
}
function updateOk(){
deferA.resolve()
}
function updateFail(){
deferA.reject()
}
function areweonline(){
$.ajax(.....)
}
function selectrows(){
db.transaction('update....',[params],buildarray,selectFail)
}
function buildarray(transaction,results){
console.log('building array')
for(i=0;i<=results.rows.length;i++){
var row = results.rows.item(i);
var job = {};
job.text = row["testtext"]
arrvals.push(job);
}
deferB.resolve()
}
function selectFail(){
deferB.reject();
}
function callwebservice(vals){
$.ajax(....) /* this bit is working fine*/
}
function SaveButtonClicked(){
deferA = $.Deferred();
deferB = $.Deferred();
$.when(deferA).then(
console.log('update completed')
$.when(deferB).then(function(){
console.log('array built')
callwebservice(arrvals)
})
)
}
那么最好的方法是什么? $ .Deffered,queue,callback ...黑魔法?
答案 0 :(得分:1)
以这种方式尝试
function updatedb(params) {
var deferA = $.Deferred(),
updateOk = function() { deferA.resolve(); },
updateFail = function() { deferA.reject(); }
db.transaction('update....',[params],updateOk,updateFail);
return deferA.promise();
}
function selectrows() {
var arrvals = [];
var deferB = $.Deferred(),
buildarray = function (transaction, results) {
console.log('building array')
for(i = 0; i <= results.rows.length; i++){
var row = results.rows.item(i);
var job = {};
job.text = row["testtext"]
arrvals.push();
}
deferB.resolve(arrvals);
},
selectFail = function() {
deferB.reject();
};
db.transaction('update....',[params],buildarray,selectFail);
return deferB.promise();
}
function callwebservice(vals) { $.ajax(....) /* this bit is working fine*/ }
function SaveButtonClicked(){
$.when(updatedb('your params here')).then(
console.log('update completed')
$.when(selectrows()).then(function(arr){
console.log('array built');
callwebservice(arr)
})
)
}
一些想法
push()
函数上有一个空的selectrows
(我认为这不是你想要的,因为arrvals
是空的); arrvals
现在在selectrows()
函数中定义,您可以在解析延迟任务时传递它; areweonline()
功能已从我的示例中移除(因为您未在代码段中的任何位置使用它); when()
现在正在寻找承诺(而不是延期)。注意:我没有尝试执行代码,但希望这无论如何都有帮助