###deferred機制
從1.5版本開始,jquery加入了deferred功能,讓事件處理佇列更加的完善。並用
這個機制重寫了ajax模組。雖然還沒輪到ajax,但是接下來的事件處理函式中牽扯到了
這個機制,所以提前看這段**。
deferred把**函式註冊到乙個佇列中,統一管理,並且可以同步或者非同步地呼叫
這些函式。jquery.deferred()用來構造乙個deferred物件。該物件有狀態值,共有三種:
rejected, resolved和初始狀態。其中resolved表示該操作成功完成了,而rejected
則表示出現了錯誤,呼叫失敗。deferred物件的主要成員如下:
* done(callback): 註冊乙個callback函式,當狀態為resolved時被呼叫。
* fail(callback): 註冊乙個callback函式,當狀態為rejected時被呼叫。
* always(callback): 註冊乙個callback函式,無論是resolved或者rejected都會被
呼叫。* then(successcallback, failurecallback): 同時傳入成功和失敗的**函式。
* pipe(successfilter, failurefilter): 在呼叫成功和失敗的**函式前先呼叫pipe
指定的函式。算是一種管道機制,攔截了函式呼叫。
* resolve(args): 把狀態設定為resolved。
* reject(args): 把狀態設定為rejected。
* promse(): 返回的是乙個不完整的deferred的介面,沒有resolve和reject。即不能
修改deferred物件的狀態。可以看作是一種唯讀檢視。這是為了不讓外部函式提早觸發
**函式。比如$.ajax在1.5版本後不再返回xmlhttprequest,而是返回乙個封裝了
xmlhttprequest和deferred物件介面的object。其中deferred部分就是promise()得到
的,這樣不讓外部函式呼叫resolve和reject,防止在ajax完成前觸發**函式。把這
兩個函式的呼叫許可權保留給ajax內部。
這個模組的**從939行開始,緊接著jquery物件的宣告。也算是乙個基礎核心**了。
同時也是1.5版本最大的變化之一。
實際上resolve和reject的**邏輯是一樣的,只是對應的狀態不同而已。為了**復用,
內部先實現了乙個\_deferred,然後真正的deferred內部new了兩個\_deferred,乙個作為
resolve,另乙個作為reject。
\_deferred物件內部維護了乙個函式陣列(callback list)。done(f1, f2...)的工作
就是把這些callback依次push到這個佇列中儲存下來。而resolvewith(帶參的resolve)
和resolve依次呼叫這寫callback函式。
done中,需要判斷事件是否已經完成。如果callback加入chain時事件已經完成,則
需要馬上執行callback。這個特性是讓callback不用再和觸發非同步事件宣告寫在一起
的原因。比如原來必須寫$.post("...", function(data) )。這個success
callback必須寫在這裡,而現在可以寫:
var defer = $.post("...");這樣非同步事件的宣告和**函式就可以分別管理了。這是1.5版本重寫後的最大變化。// ...
defer.success(function(data) );
// ...
defer.fail(function(data) );
pipe(successfilter, failurefilter)函式修改了原來物件中的callback list。在兩個callback
list前面用then函式分別插入了filter函式。然後返回。這樣當這個deferred物件的狀態變化時,會
先呼叫pipe函式指定的filter函式,然後才會呼叫callback list。
promise()則單純許多,就是new乙個新object,然後把需要的成員copy進去。這個需要的成員定義在
乙個叫promisemethods常量中。
var promisemethods = "done fail isresolved isrejected promise then always pipe".split(" ");ps: 今天把markdown環境配置好後,用vim編寫markdown,然後複製過來直接發布。感覺不錯
jQuery 原始碼分析筆記 6
jquery.data data模組 是乙個比較有趣的功能,可以為任意的element 新增額外的資料。而且處理了迴圈引用和記憶體洩漏的問題。api非常簡單,就是.data key,value 用來儲存,data key 用開查詢資料。data部分的 從1381行開始。最開始的幾行關鍵 jquery...
jQuery原始碼分析
工具 版本說明 版本號備註 jquery 2.1.1 sublime 3jquery function selector,context jquery.fn jquery.prototype 快速匹配正則 不加g 不光匹配整體項還會匹配到子項 rquickexpr s w w w init jque...
jQuery原始碼分析
一 jquery如何做到不汙染變數名並暴露出 供使用者使用 jquery將變數和 寫進立即執行函式,通過函式來包裹所有的變數和方法,再在這個立即執行函式上將 jquery方法繫結到window上,就可以讓使用者使用到jq方法了。二 jquery是如何做到 jquery 的?function wind...