Jquery:用延迟控制函数流

时间:2012-05-23 08:47:10

标签: jquery queue jquery-deferred deferred chain

道歉,但我好像是围成一圈。

这个过程非常明确

  1. SaveButtonClicked

  2. 调用函数执行脱机db事务以更新记录

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

  4. 如果在线调用select transaction以获取所有更新的记录

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

  6. 使用数组

  7. 调用webservice 到目前为止,我一直试图控制流量 $ .Deferred,dothis = defer.pipe(...), .queue [但这些似乎是基于一个元素而不是一个完成的函数], 将函数放入数组中,

    在测试控制台时总是在'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 ...黑魔法?

1 个答案:

答案 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是空的);
  • 我重构了你的代码以使用更少的全局变量/函数:延迟对象现在在返回promise的函数内声明;
  • arrvals现在在selectrows()函数中定义,您可以在解析延迟任务时传递它;
  • areweonline()功能已从我的示例中移除(因为您未在代码段中的任何位置使用它);
  • when()现在正在寻找承诺(而不是延期)。

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