最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2011年06月19日 23:58:52   作者:  
從1.5版本開(kāi)始,jQuery加入了Deferred功能,讓事件處理隊(duì)列更加的完善。并用這個(gè)機(jī)制重寫(xiě)了Ajax模塊。雖然還沒(méi)輪到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的接口,沒(méi)有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行開(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)用這寫(xiě)callback函數(shù)。
Done中,需要判斷事件是否已經(jīng)完成。如果callback加入chain時(shí)事件已經(jīng)完成,則需要馬上執(zhí)行callback。這個(gè)特性是讓callback不用再和觸發(fā)異步事件聲明寫(xiě)在一起的原因。比如原來(lái)必須寫(xiě)$.post("...", function(data) { ... })。這個(gè)success callback必須寫(xiě)在這里,而現(xiàn)在可以寫(xiě):
復(fù)制代碼 代碼如下:

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

這樣異步事件的聲明和回調(diào)函數(shù)就可以分別管理了。這是1.5版本重寫(xiě)后的最大變化。
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)文章

  • jQuery實(shí)現(xiàn)灰藍(lán)風(fēng)格標(biāo)準(zhǔn)二級(jí)下拉菜單效果代碼

    jQuery實(shí)現(xiàn)灰藍(lán)風(fēng)格標(biāo)準(zhǔn)二級(jí)下拉菜單效果代碼

    這篇文章主要介紹了jQuery實(shí)現(xiàn)灰藍(lán)風(fēng)格標(biāo)準(zhǔn)二級(jí)下拉菜單效果代碼,涉及jquery鼠標(biāo)mouseover事件控制頁(yè)面元素樣式動(dòng)態(tài)變換的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • jquery的$().each和$.each的區(qū)別

    jquery的$().each和$.each的區(qū)別

    今天小編就為大家分享一篇關(guān)于jquery的$().each和$.each的區(qū)別,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • 利用jquery.qrcode在頁(yè)面上生成二維碼且支持中文

    利用jquery.qrcode在頁(yè)面上生成二維碼且支持中文

    這篇文章主要介紹了利用jquery.qrcode在頁(yè)面上生成二維碼且支持中文。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-02-02
  • 2013年優(yōu)秀jQuery插件整理小結(jié)

    2013年優(yōu)秀jQuery插件整理小結(jié)

    今天為大家推薦的是2013年的第一期,在這期里面十個(gè)jQuery插件涵蓋了響應(yīng)式的網(wǎng)格布局插件、圖片放大插件、表單元素中自定義select插件,google 地圖插件、文件拖放上傳插件、tooltip提示插件、3D旋轉(zhuǎn)菜單等等
    2013-11-11
  • 33個(gè)優(yōu)秀的jQuery 教程分享(幻燈片、動(dòng)畫(huà)菜單)

    33個(gè)優(yōu)秀的jQuery 教程分享(幻燈片、動(dòng)畫(huà)菜單)

    jQuery 是一個(gè)非常優(yōu)秀的 JavaScript 框架,使用簡(jiǎn)單靈活,在現(xiàn)在的Web開(kāi)發(fā)項(xiàng)目中扮演著重要角色。這篇文章與大家分享33個(gè)優(yōu)秀的 jQuery 教程,教您如何使用 jQuery 制作幻燈片、動(dòng)畫(huà)菜單、照片墻、圖片畫(huà)廊等很多效果很炫的功能。
    2011-07-07
  • jQuery中clone()方法用法實(shí)例

    jQuery中clone()方法用法實(shí)例

    這篇文章主要介紹了jQuery中clone()方法用法,實(shí)例分析了clone()方法的功能、定義及克隆匹配的DOM元素的使用技巧,需要的朋友可以參考下
    2015-01-01
  • jquery 簡(jiǎn)單導(dǎo)航實(shí)現(xiàn)代碼

    jquery 簡(jiǎn)單導(dǎo)航實(shí)現(xiàn)代碼

    jquery簡(jiǎn)單導(dǎo)航實(shí)現(xiàn)代碼,需要的朋友可以參考下。
    2009-09-09
  • jQuery on()方法使用技巧詳解

    jQuery on()方法使用技巧詳解

    這篇文章主要介紹了jQuery on()方法使用技巧詳解,本文講解了trigger()綁定、多個(gè)事件綁定同一個(gè)函數(shù)、多個(gè)事件綁定不同函數(shù)、綁定自定義事件、傳遞數(shù)據(jù)到函數(shù)等技巧,需要的朋友可以參考下
    2015-04-04
  • JQuery中的常用事件、對(duì)象屬性與使用方法分析

    JQuery中的常用事件、對(duì)象屬性與使用方法分析

    這篇文章主要介紹了JQuery中的常用事件、對(duì)象屬性與使用方法,結(jié)合實(shí)例形式分析了jquery事件、對(duì)象屬性、方法相關(guān)使用技巧,需要的朋友可以參考下
    2019-12-12
  • 基于jquery的DIV隨滾動(dòng)條滾動(dòng)而滾動(dòng)的代碼

    基于jquery的DIV隨滾動(dòng)條滾動(dòng)而滾動(dòng)的代碼

    基于jquery的DIV隨滾動(dòng)條滾動(dòng)而滾動(dòng)的代碼,有了JQuery簡(jiǎn)單多了,就幾行代碼搞定
    2012-07-07

最新評(píng)論

宣化县| 连城县| 淮滨县| 炎陵县| 汉源县| 黔西县| 昭苏县| 理塘县| 六安市| 安溪县| 大洼县| 稷山县| 南部县| 邵阳市| 安义县| 土默特左旗| 尚志市| 普洱| 兖州市| 龙口市| 林甸县| 南丹县| 金平| 清河县| 抚州市| 普定县| 天峻县| 中宁县| 裕民县| 改则县| 邯郸市| 县级市| 科尔| 临泽县| 体育| 通榆县| 专栏| 陆良县| 宣恩县| 巴彦县| 阿勒泰市|