国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

jQuery的deferred對象使用詳解

2019-11-20 08:53:29
字體:
來源:轉載
供稿:網友

之前看別人的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 

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

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

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

相比之下,done方法更純粹吧,then方法會更復雜一些,但不能完全替代done方法,使用then方法的話,還是小心些的好。

附Deferred對象的其它方法:

// 創建延遲對象 <br>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將不再被執行

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 六安市| 政和县| 平昌县| 若尔盖县| 嘉祥县| 泊头市| 财经| 沙雅县| 会泽县| 嘉义市| 丽江市| 葫芦岛市| 蒲江县| 庆元县| 永登县| 五寨县| 辽阳市| 常州市| 上高县| 和林格尔县| 平潭县| 宁阳县| 勐海县| 阜新市| 张家界市| 东方市| 兴海县| 肥西县| 忻城县| 凤翔县| 西盟| 长海县| 福州市| 新河县| 邳州市| 乌拉特前旗| 通江县| 旅游| 邹平县| 莒南县| 韶关市|