• jquery的Deferred对象


    一、Deferred对象

    对于不能马上得出结果的操作,比如ajax操作、animate动画等等,往往需要指定回调函数来进行后续工作,deferred就是jQuery针对回调函数的解决方案,所有操作都能用defferd对象指定回调函数

    1、比如,让el元素依次进行动画(右移、左移、宽度缩小),下一个动画要等上一个执行完毕后才能执行,这样的嵌套让代码结构变得复杂,而且阅读上也困难。

    el.animate({
        'left' : '500px' 
    },1000,function(){
        // 回调一
        el.animate({
            'left' : '100px' 
        },1000,function(){
            // 回调二
            el.animate({
                'width' : "100px" 
            },1000,function(){/*回调...*/})
        })
    })

    2、ajax方法

    在deferred对象没出来之前,也就是jQuery1.5版本之前,ajax操作完成后返回的是XHR对象,jQuery1.5版本之后,ajax方法返回的是deferred对象,可以进行链式操作。

    jQuery1.5之前:

    $.ajax({
        url : "./test.html",
        success : function(data){
            console.log(data);
        },
        error : function(){
            console.log('fail')
        }
    })

    新写法:

    $.ajax("./test.html")
    .done(function(data){console.log(data)})
    .fail(function(){console.log('fail')});

    可以指定多个回调函数:

    $.ajax("./test.html")
    .done(function(data){console.log(data)})
    .fail(function(){console.log('fail')})
    .done(function(){console.log("第二次回调函数")});

    可以为多个操作指定回调函数:

    $.when($.ajax("./test.html"),$.ajax("./js/test.json"))
    .done(function(data){console.log(data)})  //请求都成功才能执行,返回的结果是数组
    .fail(function(){console.log('fail')})    //有一个失败会执行
    .done(function(){console.log("第二次回调函数")});

     二、常见用法

    $.when().done().fail()链式调用和deferred对象的结合,$.when方法的参数必须为deferred对象,使用如下:

    function wait(){
        var Def = $.Deferred(); //声明一个Deferred对象
        setTimeout(function(){
            console.log('执行完毕');
            Def.resolve();  //改变Deferred对象的执行状态
        },3000);
        return Def;
    }
    $.when(wait()) // $.when参数必须是Deferred对象,否则,done方法会立即执行,没有回调函数的作用
    .done(function(){console.log('done')})
    .fail(function(){console.log('fail')});

    三、deferred对象方法

    1、$.Deferred生成一个Deferred对象,Deferred对象的初始执行状态为“未完成”

    2、deferred.resolve() 改变Deferred对象的执行状态为“已完成”,从而执行done方法指定的回调函数

    3、deferred.reject()  改变Deferred对象的执行状态为“已失败”,从而执行fail方法指定的回调函数

    4、deferred.promise() 

    5、then方法 管道模式执行回调

      

  • 相关阅读:
    实际成本法
    加权平均法,移动加权平均法,先进先出法(计算策略)
    xss缺陷--脚本语言嵌入漏洞
    关于耳机插入,设备管理中:声音设置中却显示"没有耳机插入"
    国家十二类稀缺人才
    apache2.4搭建php5.53问题总结
    任意多个有序结合求交集
    类似于大数相加的一个题
    数字的最大组合
    计算二叉树每层的和
  • 原文地址:https://www.cnblogs.com/zhaoliner/p/6233891.html
Copyright © 2020-2023  润新知