本篇博文是对阮一峰的一篇日志的归纳
1 var func1 = function() {
2 $.ajax("/echo/json")//jquery1.5以后返回deferred对象, 1.5以前返回XHR对象, 无法使用链式操作
3 .done(function(){//相当于success方法
4 alert("success!");
5 })
6 .fail(function(){//相当于error方法
7 alert("fail!");
8 })
9 .done(function(){//可以指定多个回调函数
10 alert("done again");
11 })
12 .fail(function(){
13 alert("fail again");
14 })
15 .always(function(){//相当于complete方法
16 alert("always!");
17 });
18 }
19
20 var func2 = function() {
21 var def = $.Deferred();
22 var wait = function(){
23 var task = function() {
24 alert("task done");
25 def.resolve();
26 }
27 setTimeout(task, 3000);
28 /*返回promise对象,这样就无法再wait方法外修改deferred对象的状态*/
29 return def.promise();
30 }
31
32 var d = wait();
33 $.when(d)
34 .done(function(){
35 alert("done");
36 });
37 //d.reject();//语句无效,因为promise对象无修改deferred对象状态的方法
38 }
39
40 var func3 = function(){
41 var wait = function() {
42 //将deferred对象设置为wait方法的内部对象更保险
43 var def = $.Deferred();//deferred对象状态:未完成
44 var task = function(){
45 alert("task done");
46 def.resolve();//状态:已完成, 会触发done方法
47 //def.reject();//状态:已失败, 会触发fail方法
48 }
49 setTimeout(task, 3000);
50 return def;
51 }
52
53 $.when(wait())//when方法要求接受一个deferred对象
54 .done(function(){
55 alert("done");
56 });
57 }
58
59 var func4 = function(){
60 //将done和fail方法合并
61 $.when($.ajax("/echo/json"))
62 .then(function(){
63 alert("done");
64 }, function(){
65 alert("fail");
66 });
67 }
68
69 var func5 = function(){
70 var d = $.Deferred();
71 var task = function(){
72 alert("do something");
73 }
74 d.progress(task);//注册事件
75 d.notify();//触发progress注册的事件
76 }