亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2011年06月19日 23:58:52   作者:  
從1.5版本開始,jQuery加入了Deferred功能,讓事件處理隊(duì)列更加的完善。并用這個(gè)機(jī)制重寫了Ajax模塊。雖然還沒輪到Ajax,但是接下來(lái)的事件處理函數(shù)中牽扯到了這個(gè)機(jī)制,所以提前看這段代碼。
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的接口,沒有resolve和reject。即不能修改Deferred對(duì)象的狀態(tài)??梢钥醋魇且环N只讀視圖。這是為了不讓外部函數(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行開始,緊接著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(" ");

相關(guān)文章

最新評(píng)論