zoukankan      html  css  js  c++  java
  • jQuery deferred对象API详解

    jQuery在1.5开始引入deferred(延迟),简单说,deferred对象就是jQuery的回调函数解决方案。

    jQuery1.5中,Deferred对象提供一种方式来注册多个回调,添加到自已管理的回调队列中,调用适当的回调队列,并转达同步或异步函数的成功或失败状态。
    deferred对象有三种执行状态:未完成(pending),已完成(resolved)和已失败(rejected)

    API概览:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    deferred object = {
        always(alwaysCallbacks [, alwaysCallbacks])
        //延迟对象不管成功或失败都最终会执行该方法
     
        done(doneCallbacks)
        //延迟对象成功完成后调用
     
        fail(failCallbacks)
        //延迟对象失败后调用
     
        isRejected()
        //确定延迟对象是否已失败
     
        isResolved()
        //确定延迟对象是否已成功
     
        notify( args )
        //用来触发一个自定义事件fireEvent
     
        notifyWith(context, [args])
        //跟notify一样,但可以指定上下文
     
        pipe([doneFilter] [, failFilter] [, progressFilter] )
        //jQuery的1.8,deferred.pipe()方法已经被淘汰。
        //用deferred.then()替代
     
        progress( progressCallbacks )
        //用来监控函数执行过程,进度处理程序,见:notify 方法
     
        reject([args])
        //使延迟对象的状态变为失败,对应的回调函数绑定方法为fail。
     
        rejectWith(context, [args])
        //使用方法与reject一样,但是可以指定上下文,使用可以参考 resolveWidth
     
        resolve([args])
        //使延迟对象的状态变为成功,对应的回调函数绑定方法为done。
     
        resolveWith(context, [args])
        //使用方法与resolve一样,但是可以指定上下文
     
        state()
        //查询延迟对象的状态,有三种:pending resolved rejected
     
        then(doneCallbacks, failCallbacks [, progressCallbacks])
        //一种缩写,用法与done,fail一样
     
        promise([target])
        //在原来的deferred对象上返回另一个deferred对象,
        //这个新的deferred对象屏蔽了改变状态的方法。
    }


    入门应用:

    1
    2
    3
    $.ajax("test.php")
    .done(function(){ alert("成功了!"); })
    .fail(function(){ alert("出错啦!"); });

    从1.5开始,ajax对象不再返回xhr对象,而是deferred对象。通过.done执行成功回调,通过.fail执行失败回调。

    1、$.when
    返回一个Deferred对象,允许你为多个事件指定一个回调函数。

    1
    2
    3
    $.when($.ajax("test.php"),$.ajax("test2.php"))
    .done(function(){ alert("成功了!"); })
    .fail(function(){ alert("出错啦!"); });

    这是一个与操作,只有test.php和test2.php都成功时才会执行done,否则执行fail;

    2、resolve和reject的用法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var def = $.Deferred(); //创建deferred对象
    var readConf = function(){
        fs.readFile('test.txt','utf-8', function(err, data) {
            if (err) {
               def.reject(); //改变deferred对象状态成失败
            } else {
               def.resolve(); //改变deferred对象状态成成功
            }
        });
        return def;  //返回
    }
     
    $.when(readConf())
    .done(function(){ alert("成功了!"); })
    .fail(function(){ alert("出错啦!"); });

    3、promise用法
    例2中,定义的def为全局变量,在作用域范围内,可以通过def.reject()或def.resolve()来改变其本身的状态,这样影响def的安全性,promise在原来的deferred对象上返回另一个deferred对象,这个新的deferred对象屏蔽了改变状态的方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    var def = $.Deferred(); //创建deferred对象
    var readConf = function(){
        fs.readFile('test.txt','utf-8', function(err, data) {
            if (err) {
               def.reject(); //改变deferred对象状态成失败
            } else {
               def.resolve(); //改变deferred对象状态成成功
            }
        });
        return def.promise();  //通过promise返回deferred对象,起到状态保护作用
    }
     
    $.when(readConf())
    .done(function(){ alert("成功了!"); })
    .fail(function(){ alert("出错啦!"); });
     
    def.reject(); //更改无效

    4、notify和progress用法
    两者一般结合使用,有点自定义事件的意思。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    var def = $.Deferred(); //创建deferred对象
    var readConf = function(){
        def.notify('start');
        fs.readFile('test.txt','utf-8', function(err, data) {
            if (err) {
                def.reject(); //改变deferred对象状态成失败
                def.notify('fail');
            } else {
                def.resolve(); //改变deferred对象状态成成功
                def.notify('success');
            }
        });
        return def;
    }
     
    $.when(readConf())
    .progress(function(_event){
        console.log(_event); //打印start,fail 或 start,success
        //_event是def.notify参数中指定的自定义事件名,是一个字符串
        //此处可以跟据不同事件进行相应的逻辑处理
    });

    5、then用法

    1
    2
    $.when(readConf())
    .then(function(){ alert("成功了!"); },function(){ alert("出错啦!"); });
  • 相关阅读:
    关于隐藏元素高度的问题 css visibility:hidden 与 display:none的区别
    三星R428 内存不兼容金士顿2G DDR3
    IE (6-11)版本,在使用iframe的框架时,通过a标签javascript:; 和js跳转parent.location的时候 出现在新页面打开的情况
    按键精灵 vbs 获取网页源码 xp系统被拒绝
    threejs 组成的3d管道,寻最短路径问题
    javaweb部署多个项目(复制的项目)
    添加无登录权限的SSH用户命令
    Using Blocks in iOS 4: Designing with Blocks
    Using Blocks in iOS 4: The Basics
    Understanding Objective-C Blocks
  • 原文地址:https://www.cnblogs.com/onflying/p/3240649.html
Copyright © 2011-2022 走看看