jQuery的延遲對象

以前看別人的demo,發如今延遲對象被resolve時要執行的代碼,有時會寫在deferred.then方法裏執行,有時會寫在deferred.done方法裏執行。
這讓對延遲對象只知其一;不知其二的我很是困惑,今天抽時間研究了一下下,發現:在某種環境下,兩個方法的確能實現一樣的效果。
這種特定的環境是怎樣呢?
 
先看一下deferred.done的用法:
// 建立deferred對象
var dtd = $.Deferred();

// 解決deferred對象
dtd.resolve('finish');
// 調用done方法
dtd.done(doneCallback [, doneCallback])
// 當deferred對象被 resolve 時,執行doneCallback函數
// 參數可爲一個函數、多個函數或函數數組
// 返回原來的deferred或promise對象

  

再看下deferred.then的用法和特性: 
// 建立deferred對象
var dtd = $.Deferred();

// 解決deferred對象
dtd.resolve('finish');

// 調用then方法
deferred.then(doneFilter [, failFilter] [, progressFilter])
// then方法特性:
// 當deferred對象被resolve時,執行doneFilter函數
// 當deferred對象被reject時,執行failFilter函數
// 當dederred對象被progress時,執行progressFilter函數
// 返回值:1,返回deferred的promise對象,可修改promise傳遞的值( 原來resolve,reject 的返回值爲a,將a修改成b,返回b,該promise的done或fail收到的返回值變爲b );
// 返回值:2,在then方法內建立新的deferred對象並返回其promise
// 返回的promise對象能夠連接其餘的延遲對象,如done,fail,then等
// 多個then方法時,異步執行( one by one )
// 該方法會過濾掉deferred修改狀態的方法,返回值deferred對象的promise 

根據以上兩個方法的特性,發現:javascript

deferred.then和deferred.done方法均可以直接收一個參數函數,且第一個參數函數都是在deferred對象在resolve時被調用。java

雖然說then方法可改變返回值,但在不考慮返回值且只有一個參數函數的前提下,兩個方法的確能夠實現同樣的效果。數組

相比之下,done方法更純粹吧,then方法會更復雜一些,但不能徹底替代done方法,使用then方法的話,仍是當心些的好。promise

 

 

附Deferred對象的其它方法:異步

 
// 建立延遲對象 
var dtd = $.Deferred();

 

var state = dtd.state();
// 返回deferred對象當前狀態,pending / resolved / rejected
// 不接受任何參數

     

deferred.always( alwaysCallback [, alwaysCallback] );
// 當deferred對象被解決或拒絕時,都執行此方法
// 參數能夠是一個函數,或是一個函數數組

  

dtd.promise( [obj] );
// 目的: 防止其餘代碼干涉其內部進度和狀態
// 返回新的promise對象,包含能夠執行的方法( done, fail, then, always, progress, state, promise ),
// 不包含修改Deferred狀態的方法( resolve, reject, notify, resolveWith, rejectWith, nodifyWith )
// 需返回deferred對象時,建議返回deferred.promise()

  

dtd.resolve( [args] )
// 解決deferred對象,調用全部doneCallback函數
// doneCallback可經過then方法中第一個參數設置,也可經過dtd.done( doneCallback )添加
// 參數將傳遞給doneCallback。參數可選
// 只有deferred對象的建立者才能夠調用的方法
// doneCallback中this爲deferred或promise對象
// doneCallback只接收一個參數

  

dtd.resolveWith( context [,args] )
// 解決deferred對象,調用全部doneCallback函數
// 參數:第一個參數爲上下文即this對象,doneCallback的this將被修改;第二個參數爲數組
// doneCallback中this爲調用resolveWith方法的上下文
// doneCallback接收參數個數爲該方法第二個參數數組的長度
// 與resolve方法的區別在於,將改變doneCallback函數的this指向

  

dtd.reject( [args] )
// 拒絕deferred對象,調用全部failCallback函數
// failCallback可經過then方法中第二個參數設置,也可經過dtd.fail( failCallback )添加
// 參數將傳遞給failCallback。參數可選
// 只有deferred對象的建立者才能夠調用的方法
// failCallback中this爲deferred或promise對象
// failCallback只接收一個參數

  

dtd.rejectWith(context,  [args] )
// 解決deferred對象,調用全部failCallback函數
// 參數:第一個參數爲上下文即this對象,failCallback的this將被修改;第二個參數爲數組
// failCallback中this爲調用rejectWith方法的上下文
// failCallback接收參數個數爲該方法第二個參數數組的長度
// 與resolve方法的區別在於,將改變failCallback函數的this指向

  

dtd.notify( [args] )
// deferred進行處理時,調用全部的progressCallback函數
// progressCallback可經過then方法中的第3個參數設置,也能夠經過deferred.progress( progressCallback )添加
// 一般此方法只能被deferred對象的建立者調用,可經過deferred.promise或then過濾此方法
// 參數可不寫。若寫有參數,建議爲字符串或可返回字符串的函數
// 當deferred進入 resolved 或rejected狀態後,再調用notify方法,progressCallback將再也不被執行

  

dtd.notifyWith(context,  [args] )
// deferred進行處理時, 調用全部progressCallback函數
// 參數:第一個參數爲上下文即this對象,progressCallback的this將被修改;第二個參數爲數組
// progressCallback中this爲調用rejectWith方法的上下文
// progressCallback接收參數個數爲該方法第二個參數數組的長度
// 與resolve方法的區別在於,將改變progressCallback函數的this指向
// 當deferred進入 resolved 或rejected狀態後,再調用notifyWith方法,progressCallback將再也不被執行
相關文章
相關標籤/搜索