jQuery deferred對象API詳解

jQuery在1.5開始引入deferred(延遲),簡單說,deferred對象就是jQuery的回調函數解決方案。php

jQuery1.5中,Deferred對象提供一種方式來註冊多個回調,添加到自已管理的回調隊列中,調用適當的回調隊列,並轉達同步或異步函數的成功或失敗狀態。
deferred對象有三種執行狀態:未完成(pending),已完成(resolved)和已失敗(rejected)ajax

API概覽:promise

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執行失敗回調。異步

一、$.when
返回一個Deferred對象,容許你爲多個事件指定一個回調函數。函數

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

這是一個與操做,只有test.php和test2.php都成功時纔會執行done,不然執行fail;spa

二、resolve和reject的用法code

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

三、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(); //更改無效

四、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參數中指定的自定義事件名,是一個字符串
     //此處能夠跟據不一樣事件進行相應的邏輯處理
});

五、then用法

1
2
$.when(readConf())
.then( function (){ alert( "成功了!" ); }, function (){ alert( "出錯啦!" ); });
相關文章
相關標籤/搜索