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( "出错啦!" ); });

转载于:https://www.cnblogs.com/onflying/p/3240649.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值