亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

jquery 中的 deferred 對(duì)象

Meathill / 1578人閱讀

摘要:中文文檔簡(jiǎn)單說(shuō),對(duì)象就是的回調(diào)函數(shù)解決方案。為了讓回調(diào)函數(shù)的名字統(tǒng)一,便于在中使用。普通操作的回調(diào)函數(shù)接口對(duì)象的最大優(yōu)點(diǎn),就是它把這一套回調(diào)函數(shù)接口,從操作擴(kuò)展到了所有操作。指定操作成功時(shí)的回調(diào)函數(shù)。

參考鏈接

jQuery API中文文檔

jQuery.Deferred

jQuery.when

jQuery的deferred對(duì)象詳解

jQuery deferred 對(duì)象的 promise 方法

jQuery中的Deferred-詳解和使用

什么是 deferred 對(duì)象?
延遲對(duì)象,在jQuery的1.5引入,是通過(guò)調(diào)用jQuery.Deferred()方法創(chuàng)建一個(gè)可鏈?zhǔn)秸{(diào)用的工具對(duì)象。 它可以注冊(cè)多個(gè)回調(diào)到回調(diào)隊(duì)列, 調(diào)用回調(diào)隊(duì)列,準(zhǔn)備代替任何同步或異步函數(shù)的成功或失敗狀態(tài)?!猨Query API中文文檔
簡(jiǎn)單說(shuō),deferred對(duì)象就是jQuery的回調(diào)函數(shù)解決方案。在英語(yǔ)中,defer的意思是"延遲",所以deferred對(duì)象的含義就是"延遲"到未來(lái)某個(gè)點(diǎn)再執(zhí)行。它解決了如何處理耗時(shí)操作的問(wèn)題,對(duì)那些操作提供了更好的控制,以及統(tǒng)一的編程接口?!钜环?/pre>
deferred 對(duì)象的主要功能

ajax 操作的鏈?zhǔn)綄?xiě)法

$.ajax("test.html")
   .done(function(){ alert("success"); })
   .fail(function(){ alert("error"); });

$.ajax() 操作完成后,如果使用的是低于1.5.0版本的jQuery,返回的是XHR對(duì)象,無(wú)法進(jìn)行鏈?zhǔn)讲僮?;如果是高?.5.0版本,返回的是deferred對(duì)象,可以進(jìn)行鏈?zhǔn)讲僮鳌?梢钥吹剑?b>done() 相當(dāng)于 success 方法,fail() 相當(dāng)于 error 方法。采用鏈?zhǔn)綄?xiě)法以后,代碼的可讀性大大提高。

這里著重強(qiáng)調(diào)一下 jqXHR 對(duì)象,從 jQuery 1.5 開(kāi)始, $.ajax() 返回的 jqXHR對(duì)象 本身就是 deferred 對(duì)象,因此可以像上面代碼中那樣進(jìn)行鏈?zhǔn)秸{(diào)用。

從 jQuery 1.5 開(kāi)始,$.ajax()返回的jqXHR對(duì)象 實(shí)現(xiàn)了 Promise 接口, 使它擁有了 Promise 的所有屬性,方法和行為。(見(jiàn)Deferred object獲取更多信息)。為了讓回調(diào)函數(shù)的名字統(tǒng)一,便于在$.ajax()中使用。jqXHR也提供.error() .success()和.complete()方法。這些方法都帶有一個(gè)參數(shù),該參數(shù)是一個(gè)函數(shù),此函數(shù)在 $.ajax()請(qǐng)求結(jié)束時(shí)被調(diào)用,并且這個(gè)函數(shù)接收的參數(shù),與調(diào)用 $.ajax()函數(shù)時(shí)的參數(shù)是一致。這將允許你在一次請(qǐng)求時(shí),對(duì)多個(gè)回調(diào)函數(shù)進(jìn)行賦值,甚至允許你在請(qǐng)求已經(jīng)完成后,對(duì)回調(diào)函數(shù)進(jìn)行賦值(如果該請(qǐng)求已經(jīng)完成,則回調(diào)函數(shù)會(huì)被立刻調(diào)用)。

注意事項(xiàng): jqXHR.success(), jqXHR.error(), 和 jqXHR.complete() 回調(diào)從 jQuery 1.8開(kāi)始 被棄用過(guò)時(shí),從jQuery 3.0開(kāi)始被刪除,你可以使用 jqXHR.done(), jqXHR.fail(), 和 jqXHR.always() 代替。

指定同一操作的多個(gè)回調(diào)函數(shù)
deferred 對(duì)象的一大好處,就是它允許你自由添加多個(gè)回調(diào)函數(shù)。還是以上面的代碼為例,如果ajax操作成功后,除了原來(lái)的回調(diào)函數(shù),我還想再運(yùn)行一個(gè)回調(diào)函數(shù),怎么辦?很簡(jiǎn)單,直接把它加在后面就行了。

$.ajax("test.html")
   .done(function(){ alert("success"); })
   .fail(function(){ alert("error"); })
    .done(function(){ alert("第二個(gè)回調(diào)函數(shù)!"); });

回調(diào)函數(shù)可以添加任意多個(gè),它們按照添加順序執(zhí)行。

為多個(gè)操作指定回調(diào)函數(shù)
deferred 對(duì)象的另一大好處,就是它允許你為多個(gè)事件指定一個(gè)回調(diào)函數(shù),這是傳統(tǒng)寫(xiě)法做不到的。

請(qǐng)看下面的代碼,它用到了一個(gè)新的方法 jQuery.when():

$.when($.ajax("test1.html"), $.ajax("test2.html"))
   .done(function(){ alert("success"); })
   .fail(function(){ alert("error"); });

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

$.when() 方法的使用具體 參見(jiàn)文檔。

普通操作的回調(diào)函數(shù)接口
deferred 對(duì)象的最大優(yōu)點(diǎn),就是它把這一套回調(diào)函數(shù)接口,從ajax操作擴(kuò)展到了所有操作。也就是說(shuō),任何一個(gè)操作----不管是ajax操作還是本地操作,也不管是異步操作還是同步操作----都可以使用deferred對(duì)象的各種方法,指定回調(diào)函數(shù)。

我們來(lái)看一個(gè)具體的例子,為一個(gè)很耗時(shí)的操作 wait 指定回調(diào)函數(shù):

var wait = function (dtd) {
    var dtd = $.Deferred(); // 在函數(shù)內(nèi)部,新建一個(gè)Deferred對(duì)象
    var tasks = function () {
        alert("執(zhí)行完畢!");
        dtd.resolve(); // 改變Deferred對(duì)象的執(zhí)行狀態(tài)
    };

    setTimeout(tasks, 5000);
    return dtd.promise(); // 返回promise對(duì)象
};

$.when(wait())
    .done(function () { alert("success"); })
    .fail(function () { alert("error"); });

另一種做法是直接將 wait 函數(shù)傳入 $.Deferred()

$.Deferred(wait)
   .done(function(){ alert("success"); })
   .fail(function(){ alert("error"); });

jQuery 規(guī)定,$.Deferred() 可以接受一個(gè)函數(shù)名(注意,是函數(shù)名)作為參數(shù),$.Deferred() 所生成的 deferred 對(duì)象將作為這個(gè)函數(shù)的默認(rèn)參數(shù)。

更具體的信息請(qǐng)參見(jiàn) 阮一峰的文檔。

deferred 對(duì)象的方法

$.Deferred() 生成一個(gè) deferred 對(duì)象。
jQuery.Deferred( [beforeStart ] ) 工廠函數(shù)創(chuàng)建一個(gè)新的deferred對(duì)象。

描述: 一個(gè)工廠函數(shù),這個(gè)函數(shù)返回一個(gè)鏈?zhǔn)綄?shí)用對(duì)象,用返回對(duì)象方法來(lái)在回調(diào)隊(duì)列中注冊(cè)多個(gè)回調(diào), 調(diào)用回調(diào)隊(duì)列,傳遞任何同步或異步函數(shù)的成功或失敗狀態(tài)。

beforeStart : 類(lèi)型 Function( Deferred deferred ),一個(gè)構(gòu)造函數(shù)返回之前調(diào)用的函數(shù)。

jQuery.Deferred 方法可以傳遞一個(gè)可選的函數(shù), 這個(gè)函數(shù)在方法返回之前調(diào)用,并且會(huì)把新的 deferred(延遲)對(duì)象作為 this 對(duì)象,將其作為第一個(gè)參數(shù)傳遞給函數(shù)。例如,被調(diào)用的函數(shù)可以使用 deferred.then() 綁定回調(diào)。

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

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

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

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

一個(gè) Deferred(延遲)對(duì)象開(kāi)始于 pending 狀態(tài)。 任何回調(diào)使用 deferred.then(), deferred.always(), deferred.done(), 或者 deferred.fail() 添加到這個(gè)對(duì)象都是排隊(duì)等待執(zhí)行。調(diào)用 deferred.resolve() 轉(zhuǎn)換 Deferred(遞延)到 resolved(解決)的狀態(tài),并立即執(zhí)行設(shè)置中任何的 doneCallbacks。調(diào)用 deferred.reject() 轉(zhuǎn)換 Deferred(遞延)到 rejected(拒絕)的狀態(tài),并立即執(zhí)行設(shè)置中任何的 failCallbacks。一旦對(duì)象已經(jīng)進(jìn)入了解決或拒絕狀態(tài),它處于該狀態(tài)?;卣{(diào)仍然可以添加到解決或拒絕 Deferred(遞延)- 他們會(huì)立即執(zhí)行。

$.ajax() 返回的 jqXHR 對(duì)象 會(huì)根據(jù)請(qǐng)求返回的結(jié)果,自動(dòng)改變自身的執(zhí)行狀態(tài)。但是,對(duì)于其他通過(guò) $.Deferred() 方法生成的 deferred 對(duì)象,它們的執(zhí)行狀態(tài)必須由程序員手動(dòng)指定,由代碼決定在什么時(shí)候觸發(fā)回調(diào)函數(shù)。

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

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

deferred.then() 方法
有時(shí)為了省事,可以把 done()fail() 合在一起寫(xiě),這就是 then() 方法。

$.when($.ajax( "/main.php" ))
   .then(successFunc, failureFunc);

如果 then() 有兩個(gè)參數(shù),那么第一個(gè)參數(shù)是 done() 方法的回調(diào)函數(shù),第二個(gè)參數(shù)是 fail() 方法的回調(diào)方法。如果 then() 只有一個(gè)參數(shù),那么等同于 done()。

deferred.always() 方法
這個(gè)方法也是用來(lái)指定回調(diào)函數(shù)的,它的作用是,不管調(diào)用的是 deferred.resolve() 還是 deferred.reject(),最后總是執(zhí)行。

$.ajax( "test.html" )
    .always( function() { alert("已執(zhí)行!");} );

更多信息請(qǐng)參見(jiàn) jQuery API中文文檔。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/103027.html

相關(guān)文章

  • jQuery源碼解析Deferred異步對(duì)象

    摘要:回調(diào)隊(duì)列對(duì)象,用于構(gòu)建易于操作的回調(diào)函數(shù)集合,在操作完成后進(jìn)行執(zhí)行。對(duì)象對(duì)象,用于管理回調(diào)函數(shù)的多用途列表。如果傳入一個(gè)延遲對(duì)象,則返回該對(duì)象的對(duì)象,可以繼續(xù)綁定其余回調(diào),在執(zhí)行結(jié)束狀態(tài)之后也同時(shí)調(diào)用其回調(diào)函數(shù)。 在工作中我們可能會(huì)把jQuery選擇做自己項(xiàng)目的基礎(chǔ)庫(kù),因?yàn)槠涮峁┝撕?jiǎn)便的DOM選擇器以及封裝了很多實(shí)用的方法,比如$.ajax(),它使得我們不用操作xhr和xdr對(duì)象,直...

    Coding01 評(píng)論0 收藏0
  • Promise介紹--DeferredjQuery

    摘要:我們稱(chēng)為回調(diào)對(duì)象,它內(nèi)部會(huì)維護(hù)一個(gè)數(shù)組,我們可以向其中添加若干個(gè)回調(diào)函數(shù),然后在某一條件下觸發(fā)執(zhí)行。第一次之后,再次新的回調(diào)函數(shù)時(shí),自動(dòng)執(zhí)行回調(diào)。當(dāng)前面的回調(diào)函數(shù)返回時(shí),終止后面的回調(diào)繼續(xù)執(zhí)行。 最近懶癌發(fā)作,說(shuō)好的系列文章,寫(xiě)了一半,一直懶得寫(xiě),今天補(bǔ)上一篇。 Deferred 我們?cè)谑褂胮romise對(duì)象時(shí),總會(huì)提到一個(gè)與它關(guān)系密切的對(duì)象——Deferred。其實(shí)Deferred沒(méi)...

    Darkgel 評(píng)論0 收藏0
  • 通過(guò) ES6 Promise 和 jQuery Deferred 的異同學(xué)習(xí) Promise

    摘要:和和都有和,但是略有不同。實(shí)際上返回的是一個(gè)對(duì)象。和添加的回調(diào),添加的回調(diào)。所以在調(diào)用成功的情況下執(zhí)行添加的回調(diào),調(diào)用失敗時(shí)執(zhí)行添加的回調(diào)。,產(chǎn)生對(duì)象并,產(chǎn)生對(duì)象并,然后繼續(xù)處理,的語(yǔ)法糖,和的差不多但不同。 Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同。不過(guò)它們的作用可以簡(jiǎn)單的用兩句話來(lái)描述 Deffere...

    Yujiaao 評(píng)論0 收藏0
  • jquery高級(jí)應(yīng)用之Deferred對(duì)象

    摘要:中的對(duì)象很好的解決了這個(gè)問(wèn)題。每一個(gè)對(duì)象都可以設(shè)置三種狀態(tài)進(jìn)行中已經(jīng)正確執(zhí)行執(zhí)行失敗關(guān)于,還有更多需要了解的地方,我這里只是拋磚引玉。的對(duì)象就是對(duì)模式的一個(gè)很好的實(shí)現(xiàn)案例。我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看看對(duì)象應(yīng)該如何使用。 在實(shí)際開(kāi)發(fā)中常常遇到這樣的問(wèn)題:B函數(shù)中需要用到的變量或者參數(shù),只有等A函數(shù)執(zhí)行完畢了才能獲取到。比如A函數(shù)中有一個(gè)ajax請(qǐng)求,而B(niǎo)函數(shù)中所需要的position變量...

    tianren124 評(píng)論0 收藏0
  • jquery高級(jí)應(yīng)用之Deferred對(duì)象

    摘要:中的對(duì)象很好的解決了這個(gè)問(wèn)題。每一個(gè)對(duì)象都可以設(shè)置三種狀態(tài)進(jìn)行中已經(jīng)正確執(zhí)行執(zhí)行失敗關(guān)于,還有更多需要了解的地方,我這里只是拋磚引玉。的對(duì)象就是對(duì)模式的一個(gè)很好的實(shí)現(xiàn)案例。我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看看對(duì)象應(yīng)該如何使用。 在實(shí)際開(kāi)發(fā)中常常遇到這樣的問(wèn)題:B函數(shù)中需要用到的變量或者參數(shù),只有等A函數(shù)執(zhí)行完畢了才能獲取到。比如A函數(shù)中有一個(gè)ajax請(qǐng)求,而B(niǎo)函數(shù)中所需要的position變量...

    monw3c 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<