Deferred對(duì)象

Deferred對(duì)象

  1. 什么是Deferred對(duì)象?
  2. Deferred對(duì)象是從jQuery 1.5.0版本開始引入的一個(gè)新功能流酬,只要為了解決某些JavaScript代碼需要耗時(shí)很長的問題而開發(fā)的對(duì)象币厕。簡單來說Deferred對(duì)象是為了解決jquery回調(diào)函數(shù)的問題。
  3. Deferred對(duì)象的含義就是"延遲"到未來某個(gè)點(diǎn)再執(zhí)行康吵。

Deferred對(duì)象的狀態(tài)

deferred對(duì)象有三種狀態(tài)

  1. 未完成劈榨,會(huì)調(diào)用progress()方法,該方法需要在1.7.0以上才會(huì)有
  2. 已完成晦嵌,會(huì)調(diào)用done()方法
  3. 已失敗,會(huì)調(diào)用fail()方法

Deferred對(duì)象功能

  1. 實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用
  2. 為同一操作綁定多個(gè)回調(diào)函數(shù)
  3. 為多個(gè)操作指定同一回調(diào)函數(shù)
  4. 為普通操作提供回調(diào)函數(shù)接口
1. $.ajax(obj)的鏈?zhǔn)綄懛?/h6>

jquery1.5.0 以前拷姿,調(diào)用 $.ajax() 方法返回的是 XMLHttpRequest 對(duì)象惭载,這就無法進(jìn)行鏈?zhǔn)讲僮鳌?/p>

如果在 jquery1.5.0 以后,調(diào)用 $.ajax() 方法返回的是 deferred 對(duì)象响巢,這就可以進(jìn)行鏈?zhǔn)讲僮髁恕?/p>

// jquery1.5.0 及以前
var xhr = $.ajax({
    url: "test.html",
    success: function(){
        alert("哈哈描滔,成功了!");
    },
    error:function(){
        alert("出錯(cuò)啦踪古!");
    }
});

// jquery1.5.0之后
$.ajax("/echo/html/")
    .done(function(){ alert("哈哈含长,成功了券腔!"); })
    .fail(function(){ alert("出錯(cuò)啦!"); });
2. 指定同一操作的多個(gè)回調(diào)函數(shù)

deferred對(duì)象的一大好處拘泞,就是它允許你自由添加多個(gè)回調(diào)函數(shù)纷纫,直接把它加在后面就行了。

$.ajax("/echo/html/")
    .done(function(){ alert("哈哈陪腌,成功了辱魁!");} )
    .fail(function(){ alert("出錯(cuò)啦!"); } )
    .done(function(){ alert("第二個(gè)回調(diào)函數(shù)诗鸭!");} );

// 彈出 哈哈染簇,成功了!
// 彈出 第二個(gè)回調(diào)函數(shù)强岸!
3. 為多個(gè)操作指定同一回調(diào)函數(shù)

下面代碼的意思是锻弓,先執(zhí)行兩個(gè)操作 $.ajax("test1.html")$.ajax("test2.html") ,如果都成功了蝌箍,就運(yùn)行done()指定的回調(diào)函數(shù)青灼;如果有一個(gè)失敗或都失敗了,就執(zhí)行fail()指定的回調(diào)函數(shù)十绑。

$.when($.ajax("test1.html"), $.ajax("test2.html"))
    .done(function(){ alert("哈哈聚至,成功了!"); })
    .fail(function(){ alert("出錯(cuò)啦本橙!"); });
4. 為普通操作提供回調(diào)函數(shù)接口
var wait = function(){
    var tasks = function(){
        alert("執(zhí)行完畢扳躬!");
    };
    setTimeout(tasks,5000);
};

$.when(wait())
    .done(function(){ alert("哈哈,成功了甚亭!"); })
    .fail(function(){ alert("出錯(cuò)啦贷币!"); });

// 因?yàn)橛泻臅r(shí)操作,tasks函數(shù)還沒有執(zhí)行完成亏狰,done里面的函數(shù)就已經(jīng)執(zhí)行了役纹,出現(xiàn)的結(jié)果就是
// 哈哈,成功了暇唾!
// 執(zhí)行完畢促脉!
// 這樣就違背了回調(diào)函數(shù)的本意
// 起不到回調(diào)函數(shù)的作用的原因在于$.when()的參數(shù)只能是deferred對(duì)象,所以我們需要提供一個(gè)deferred對(duì)象作為參數(shù)

// 改進(jìn)
var dtd = $.Deferred(); // 新建一個(gè)deferred對(duì)象
var wait = function(dtd){
    var tasks = function(){
        alert("執(zhí)行完畢策州!");
        dtd.resolve(); // 將dtd對(duì)象的執(zhí)行狀態(tài)從"未完成"改為"已完成"瘸味,從而觸發(fā)done()方法
    };
    setTimeout(tasks,5000);
    return dtd;
};

$.when(wait(dtd))   // 現(xiàn)在,wait(dtd)函數(shù)返回的是deferred對(duì)象了
    .done(function(){ alert("哈哈够挂,成功了旁仿!"); })
    .fail(function(){ alert("出錯(cuò)啦!"); });

Deferred對(duì)象的方法

  1. $.Deferred() 生成一個(gè)deferred對(duì)象

  2. deferred.done() 指定操作成功時(shí)的回調(diào)函數(shù)

  3. deferred.fail() 指定操作失敗時(shí)的回調(diào)函數(shù)

  4. deferred.promise() 沒有參數(shù)時(shí)孽糖,返回一個(gè)新的deferred對(duì)象枯冈,該對(duì)象的運(yùn)行狀態(tài)無法被改變毅贮;接受參數(shù)時(shí),作用為在參數(shù)對(duì)象上部署deferred接口

  5. deferred.resolve(arg) 手動(dòng)改變deferred對(duì)象的運(yùn)行狀態(tài)為"已完成"尘奏,從而立即觸發(fā)done()方法

  6. deferred.reject(arg) 這個(gè)方法與deferred.resolve()正好相反滩褥,調(diào)用后將deferred對(duì)象的運(yùn)行狀態(tài)變?yōu)?已失敗",從而立即觸發(fā)fail()方法

  7. $.when() 為多個(gè)操作指定回調(diào)函數(shù)

  8. deferred.then() 有時(shí)為了省事罪既,可以把done()和fail()合在一起寫铸题,這就是then()方法,如下代碼

    $.when($.ajax('/data.php')).then(succeedFunc, failedFunc);
    
    /* 注意:如果then()有兩個(gè)參數(shù)琢感,那么第一個(gè)參數(shù)是done()方法的回調(diào)函數(shù)丢间,第二個(gè)參數(shù)是fail()方法的回調(diào)方法。如果then()只有一個(gè)參數(shù)驹针,那么等同于done()  */
    
  9. deferred.always() 這個(gè)方法也是用來指定回調(diào)函數(shù)的烘挫,它的作用是,不管調(diào)用的是deferred.resolve()還是deferred.reject()柬甥,最后總是執(zhí)行

    $.ajax().always(function exec () {
        console.log('exec函數(shù)無論如何都會(huì)被執(zhí)行')饮六;
    });
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苛蒲,隨后出現(xiàn)的幾起案子卤橄,更是在濱河造成了極大的恐慌,老刑警劉巖臂外,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窟扑,死亡現(xiàn)場離奇詭異,居然都是意外死亡漏健,警方通過查閱死者的電腦和手機(jī)嚎货,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔫浆,“玉大人殖属,你說我怎么就攤上這事⊥呤ⅲ” “怎么了洗显?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長原环。 經(jīng)常有香客問我墙懂,道長,這世上最難降的妖魔是什么扮念? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮碧库,結(jié)果婚禮上柜与,老公的妹妹穿的比我還像新娘巧勤。我一直安慰自己,他們只是感情好弄匕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布颅悉。 她就那樣靜靜地躺著,像睡著了一般迁匠。 火紅的嫁衣襯著肌膚如雪剩瓶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天城丧,我揣著相機(jī)與錄音延曙,去河邊找鬼。 笑死亡哄,一個(gè)胖子當(dāng)著我的面吹牛枝缔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚊惯,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愿卸,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了截型?” 一聲冷哼從身側(cè)響起趴荸,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宦焦,沒想到半個(gè)月后发钝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赶诊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年笼平,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舔痪。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寓调,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锄码,到底是詐尸還是另有隱情夺英,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布滋捶,位于F島的核電站痛悯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏重窟。R本人自食惡果不足惜载萌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扭仁,春花似錦垮衷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至熊泵,卻和暖如春仰迁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顽分。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工徐许, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怯邪。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓绊寻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悬秉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子澄步,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一、什么是deferred對(duì)象和泌? 開發(fā)網(wǎng)站的過程中村缸,我們經(jīng)常遇到某些耗時(shí)很長的javascript操作。其中武氓,既有...
    壯哉我大前端閱讀 260評(píng)論 0 1
  • 1梯皿、什么是deferred對(duì)象 開發(fā)網(wǎng)站的過程中,我們經(jīng)常遇到某些耗時(shí)很長的javascript操作县恕。其中东羹,既有異...
    公子七閱讀 266評(píng)論 1 3
  • 最近做項(xiàng)目,調(diào)用后端接口忠烛,需要等到2個(gè)ajax返回再執(zhí)行另一個(gè)ajax属提,首先想到的是使用promise,但是考慮...
    晴天小豬L閱讀 503評(píng)論 0 0
  • JQuery 中利用 Deferred 對(duì)象提供類似 ES2016(aka. es7) 中 Promise 的功能...
    鳳歌閱讀 484評(píng)論 0 2
  • 拖著笨重的行李箱美尸,背著塞滿了書籍的背包冤议,W這才意識(shí)到與這個(gè)城市的格格不入,好不容易上了公交师坎,結(jié)果箱子倒了恕酸,衣服,書...
    霧都Ren閱讀 355評(píng)論 1 0