1

抱歉,但我似乎在兜圈子。

这个过程相当简单

  1. SaveButtonClicked

  2. 调用函数执行离线数据库事务以更新记录

  3. 检查是否在线(/*使用 Ed Norton 示例进行此操作 */)

  4. 如果在线调用选择事务以获取所有更新的记录

  5. 选择加载结果成功到数组中

  6. 使用数组调用 web 服务

到目前为止,我尝试使用 $.Deferred, dothis = defer.pipe(...), .queue [但这些似乎基于元素而不是函数完成] 来控制流程,将函数放入数组中,

在测试中,控制台总是在“构建数组”之前写入“构建数组”

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、队列、回调……黑魔法?

4

1 回答 1

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()现在正在寻找承诺(而不是延期)。

注意:我没有尝试执行代码,但希望无论如何这会有所帮助

于 2012-05-23T09:02:30.200 回答