jQuery的deferred對象使用詳解
之前看別人的demo,發(fā)現(xiàn)在延遲對象被resolve時(shí)要執(zhí)行的代碼,有時(shí)會寫在deferred.then方法里執(zhí)行,有時(shí)會寫在deferred.done方法里執(zhí)行。
這讓對延遲對象一知半解的我非常困惑,今天抽時(shí)間研究了一下下,發(fā)現(xiàn):在某種環(huán)境下,兩個(gè)方法的確能實(shí)現(xiàn)同樣的效果。
這種特定的環(huán)境是怎樣呢?
先看一下deferred.done的用法:
// 創(chuàng)建deferred對象
var dtd = $.Deferred();
// 解決deferred對象
dtd.resolve('finish');
// 調(diào)用done方法
dtd.done(doneCallback [, doneCallback])
// 當(dāng)deferred對象被 resolve 時(shí),執(zhí)行doneCallback函數(shù)
// 參數(shù)可為一個(gè)函數(shù)、多個(gè)函數(shù)或函數(shù)數(shù)組
// 返回原來的deferred或promise對象
再看下deferred.then的用法和特性:
// 創(chuàng)建deferred對象
var dtd = $.Deferred();
// 解決deferred對象
dtd.resolve('finish');
// 調(diào)用then方法
deferred.then(doneFilter [, failFilter] [, progressFilter])
// then方法特性:
// 當(dāng)deferred對象被resolve時(shí),執(zhí)行doneFilter函數(shù)
// 當(dāng)deferred對象被reject時(shí),執(zhí)行failFilter函數(shù)
// 當(dāng)dederred對象被progress時(shí),執(zhí)行progressFilter函數(shù)
// 返回值:1,返回deferred的promise對象,可修改promise傳遞的值( 原來resolve,reject 的返回值為a,將a修改為b,返回b,該promise的done或fail收到的返回值變?yōu)閎 );
// 返回值:2,在then方法內(nèi)創(chuàng)建新的deferred對象并返回其promise
// 返回的promise對象可以鏈接其他的延遲對象,如done,fail,then等
// 多個(gè)then方法時(shí),異步執(zhí)行( one by one )
// 該方法會過濾掉deferred修改狀態(tài)的方法,返回值deferred對象的promise
根據(jù)以上兩個(gè)方法的特性,發(fā)現(xiàn):
deferred.then和deferred.done方法都可以直接收一個(gè)參數(shù)函數(shù),且第一個(gè)參數(shù)函數(shù)都是在deferred對象在resolve時(shí)被調(diào)用。
雖說then方法可改變返回值,但在不考慮返回值且只有一個(gè)參數(shù)函數(shù)的前提下,兩個(gè)方法的確可以實(shí)現(xiàn)一樣的效果。
相比之下,done方法更純粹吧,then方法會更復(fù)雜一些,但不能完全替代done方法,使用then方法的話,還是小心些的好。
附Deferred對象的其它方法:
// 創(chuàng)建延遲對象 <br>var dtd = $.Deferred(); var state = dtd.state(); // 返回deferred對象當(dāng)前狀態(tài),pending / resolved / rejected // 不接受任何參數(shù) deferred.always( alwaysCallback [, alwaysCallback] ); // 當(dāng)deferred對象被解決或拒絕時(shí),都執(zhí)行此方法 // 參數(shù)可以是一個(gè)函數(shù),或是一個(gè)函數(shù)數(shù)組 dtd.promise( [obj] ); // 目的: 防止其他代碼干涉其內(nèi)部進(jìn)度和狀態(tài) // 返回新的promise對象,包含可以執(zhí)行的方法( done, fail, then, always, progress, state, promise ), // 不包含修改Deferred狀態(tài)的方法( resolve, reject, notify, resolveWith, rejectWith, nodifyWith ) // 需返回deferred對象時(shí),建議返回deferred.promise() dtd.resolve( [args] ) // 解決deferred對象,調(diào)用所有doneCallback函數(shù) // doneCallback可通過then方法中第一個(gè)參數(shù)設(shè)置,也可通過dtd.done( doneCallback )添加 // 參數(shù)將傳遞給doneCallback。參數(shù)可選 // 只有deferred對象的創(chuàng)建者才可以調(diào)用的方法 // doneCallback中this為deferred或promise對象 // doneCallback只接收一個(gè)參數(shù) dtd.resolveWith( context [,args] ) // 解決deferred對象,調(diào)用所有doneCallback函數(shù) // 參數(shù):第一個(gè)參數(shù)為上下文即this對象,doneCallback的this將被修改;第二個(gè)參數(shù)為數(shù)組 // doneCallback中this為調(diào)用resolveWith方法的上下文 // doneCallback接收參數(shù)個(gè)數(shù)為該方法第二個(gè)參數(shù)數(shù)組的長度 // 與resolve方法的區(qū)別在于,將改變doneCallback函數(shù)的this指向 dtd.reject( [args] ) // 拒絕deferred對象,調(diào)用所有failCallback函數(shù) // failCallback可通過then方法中第二個(gè)參數(shù)設(shè)置,也可通過dtd.fail( failCallback )添加 // 參數(shù)將傳遞給failCallback。參數(shù)可選 // 只有deferred對象的創(chuàng)建者才可以調(diào)用的方法 // failCallback中this為deferred或promise對象 // failCallback只接收一個(gè)參數(shù) dtd.rejectWith(context, [args] ) // 解決deferred對象,調(diào)用所有failCallback函數(shù) // 參數(shù):第一個(gè)參數(shù)為上下文即this對象,failCallback的this將被修改;第二個(gè)參數(shù)為數(shù)組 // failCallback中this為調(diào)用rejectWith方法的上下文 // failCallback接收參數(shù)個(gè)數(shù)為該方法第二個(gè)參數(shù)數(shù)組的長度 // 與resolve方法的區(qū)別在于,將改變failCallback函數(shù)的this指向 dtd.notify( [args] ) // deferred進(jìn)行處理時(shí),調(diào)用所有的progressCallback函數(shù) // progressCallback可通過then方法中的第3個(gè)參數(shù)設(shè)置,也可以通過deferred.progress( progressCallback )添加 // 通常此方法只能被deferred對象的創(chuàng)建者調(diào)用,可通過deferred.promise或then過濾此方法 // 參數(shù)可不寫。若寫有參數(shù),建議為字符串或可返回字符串的函數(shù) // 當(dāng)deferred進(jìn)入 resolved 或rejected狀態(tài)后,再調(diào)用notify方法,progressCallback將不再被執(zhí)行 dtd.notifyWith(context, [args] ) // deferred進(jìn)行處理時(shí), 調(diào)用所有progressCallback函數(shù) // 參數(shù):第一個(gè)參數(shù)為上下文即this對象,progressCallback的this將被修改;第二個(gè)參數(shù)為數(shù)組 // progressCallback中this為調(diào)用rejectWith方法的上下文 // progressCallback接收參數(shù)個(gè)數(shù)為該方法第二個(gè)參數(shù)數(shù)組的長度 // 與resolve方法的區(qū)別在于,將改變progressCallback函數(shù)的this指向 // 當(dāng)deferred進(jìn)入 resolved 或rejected狀態(tài)后,再調(diào)用notifyWith方法,progressCallback將不再被執(zhí)行
相關(guān)文章
基于jquery-resizable創(chuàng)建可調(diào)整大小的表(table)格
本文介紹如何基于jquery-resizable實(shí)現(xiàn)可調(diào)整表格(table)列寬的代碼,需要的朋友可以參考下2023-06-06
JQuery之proxy實(shí)現(xiàn)綁定代理方法
下面小編就為大家?guī)硪黄狫Query之proxy實(shí)現(xiàn)綁定代理方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
動(dòng)態(tài)調(diào)用css文件——jquery的應(yīng)用
這篇文章主要介紹了動(dòng)態(tài)調(diào)用css文件——jquery的應(yīng)用2007-02-02
最常見的左側(cè)分類菜單欄jQuery實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了最常見的左側(cè)分類菜單欄jQuery實(shí)現(xiàn)代碼,仿京東、淘寶等各大類網(wǎng)站效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
利用jQuary實(shí)現(xiàn)文字浮動(dòng)提示效果示例代碼
文字浮動(dòng)提示效果想必大家都有見到過吧,下面為大家詳細(xì)介紹下使用jquery是如何做到的,感興趣的朋友可以參考下2013-12-12
jquery進(jìn)行數(shù)組遍歷如何跳出當(dāng)前的each循環(huán)
通過 jquery 的循環(huán)方法進(jìn)行數(shù)組遍歷,但是當(dāng)不符合條件時(shí),怎么跳出當(dāng)前循環(huán),解決方法如下,需要的朋友可以參考下2014-06-06

