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

首頁(yè) > 編程 > JavaScript > 正文

jQuery 源碼分析筆記(3) Deferred機(jī)制

2019-11-20 23:47:39
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
Deferred把回調(diào)函數(shù)注冊(cè)到一個(gè)隊(duì)列中,統(tǒng)一管理,并且可以同步或者異步地調(diào)用這些函數(shù)。
jQuery.Deferred()用來(lái)構(gòu)造一個(gè)Deferred對(duì)象。該對(duì)象有狀態(tài)值,共有三種: Rejected, Resolved和初始狀態(tài)。其中Resolved表示該操作成功完成了,而Rejected 則表示出現(xiàn)了錯(cuò)誤,調(diào)用失敗。Deferred對(duì)象的主要成員如下:
done(callback): 注冊(cè)一個(gè)callback函數(shù),當(dāng)狀態(tài)為resolved時(shí)被調(diào)用。 * fail(callback): 注冊(cè)一個(gè)callback函數(shù),當(dāng)狀態(tài)為rejected時(shí)被調(diào)用。 * always(callback): 注冊(cè)一個(gè)callback函數(shù),無(wú)論是resolved或者rejected都會(huì)被調(diào)用。 * then(successCallback, failureCallback): 同時(shí)傳入成功和失敗的回調(diào)函數(shù)。 * pipe(successFilter, failureFilter): 在調(diào)用成功和失敗的回調(diào)函數(shù)前先調(diào)用pipe 指定的函數(shù)。算是一種管道機(jī)制,攔截了函數(shù)調(diào)用。 * resolve(args): 把狀態(tài)設(shè)置為Resolved。 * reject(args): 把狀態(tài)設(shè)置為Rejected。 * promse(): 返回的是一個(gè)不完整的Deferred的接口,沒(méi)有resolve和reject。即不能修改Deferred對(duì)象的狀態(tài)。可以看作是一種只讀視圖。這是為了不讓外部函數(shù)提早觸發(fā)回調(diào)函數(shù)。比如$.ajax在1.5版本后不再返回XMLHttpRequest,而是返回一個(gè)封裝了 XMLHttpRequest和Deferred對(duì)象接口的object。其中Deferred部分就是promise()得到的,這樣不讓外部函數(shù)調(diào)用resolve和reject,防止在ajax完成前觸發(fā)回調(diào)函數(shù)。把這兩個(gè)函數(shù)的調(diào)用權(quán)限保留給ajax內(nèi)部。
這個(gè)模塊的代碼從939行開(kāi)始,緊接著jQuery對(duì)象的聲明。也算是一個(gè)基礎(chǔ)核心代碼了。同時(shí)也是1.5版本最大的變化之一。
實(shí)際上Resolve和Reject的代碼邏輯是一樣的,只是對(duì)應(yīng)的狀態(tài)不同而已。為了代碼復(fù)用,內(nèi)部先實(shí)現(xiàn)了一個(gè)Deferred,然后真正的Deferred內(nèi)部new了兩個(gè)Deferred,一個(gè)作為 Resolve,另一個(gè)作為Reject。
_Deferred對(duì)象內(nèi)部維護(hù)了一個(gè)函數(shù)數(shù)組(callback list)。Done(f1, f2...)的工作就是把這些callback依次push到這個(gè)隊(duì)列中保存下來(lái)。而resolveWith(帶參的resolve)和resolve依次調(diào)用這寫callback函數(shù)。
Done中,需要判斷事件是否已經(jīng)完成。如果callback加入chain時(shí)事件已經(jīng)完成,則需要馬上執(zhí)行callback。這個(gè)特性是讓callback不用再和觸發(fā)異步事件聲明寫在一起的原因。比如原來(lái)必須寫$.post("...", function(data) { ... })。這個(gè)success callback必須寫在這里,而現(xiàn)在可以寫:
復(fù)制代碼 代碼如下:

var defer = $.post("...");
// ...
defer.success(function(data) {
// ...
});
// ...
defer.fail(function(data) {
// ...
});

這樣異步事件的聲明和回調(diào)函數(shù)就可以分別管理了。這是1.5版本重寫后的最大變化。
pipe(successFilter, failureFilter)函數(shù)修改了原來(lái)對(duì)象中的callback list。在兩個(gè)callback list前面用then函數(shù)分別插入了Filter函數(shù)。然后返回。這樣當(dāng)這個(gè)Deferred對(duì)象的狀態(tài)變化時(shí),會(huì)先調(diào)用pipe函數(shù)指定的Filter函數(shù),然后才會(huì)調(diào)用callback list。
promise()則單純?cè)S多,就是new一個(gè)新object,然后把需要的成員copy進(jìn)去。這個(gè)需要的成員定義在一個(gè)叫promiseMethods常量中。
復(fù)制代碼 代碼如下:

var promiseMethods = "done fail isResolved isRejected promise then always pipe".split(" ");
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 正安县| 莱西市| 礼泉县| 马公市| 梅州市| 洛浦县| 仁化县| 安乡县| 康马县| 泰安市| 綦江县| 湖北省| 梁平县| 阿拉善右旗| 定兴县| 孟连| 云浮市| 桦甸市| 建瓯市| 左权县| 枣阳市| 吉首市| 阿图什市| 平阴县| 三明市| 闽清县| 玉溪市| 壤塘县| 云南省| 龙山县| 二连浩特市| 江北区| 伊金霍洛旗| 桐乡市| 革吉县| 肇东市| 无为县| 泰和县| 玉环县| 沽源县| 海原县|