成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

jquery 中的 deferred 對象

Meathill / 1569人閱讀

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

參考鏈接

jQuery API中文文檔

jQuery.Deferred

jQuery.when

jQuery的deferred對象詳解

jQuery deferred 對象的 promise 方法

jQuery中的Deferred-詳解和使用

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

ajax 操作的鏈式寫法

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

$.ajax() 操作完成后,如果使用的是低于1.5.0版本的jQuery,返回的是XHR對象,無法進行鏈式操作;如果是高于1.5.0版本,返回的是deferred對象,可以進行鏈式操作??梢钥吹?,done() 相當于 success 方法,fail() 相當于 error 方法。采用鏈式寫法以后,代碼的可讀性大大提高。

這里著重強調一下 jqXHR 對象,從 jQuery 1.5 開始, $.ajax() 返回的 jqXHR對象 本身就是 deferred 對象,因此可以像上面代碼中那樣進行鏈式調用。

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

注意事項: jqXHR.success(), jqXHR.error(), 和 jqXHR.complete() 回調從 jQuery 1.8開始 被棄用過時,從jQuery 3.0開始被刪除,你可以使用 jqXHR.done(), jqXHR.fail(), 和 jqXHR.always() 代替。

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

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

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

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

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

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

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

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

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

我們來看一個具體的例子,為一個很耗時的操作 wait 指定回調函數(shù):

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

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

$.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() 可以接受一個函數(shù)名(注意,是函數(shù)名)作為參數(shù),$.Deferred() 所生成的 deferred 對象將作為這個函數(shù)的默認參數(shù)。

更具體的信息請參見 阮一峰的文檔。

deferred 對象的方法

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

描述: 一個工廠函數(shù),這個函數(shù)返回一個鏈式實用對象,用返回對象方法來在回調隊列中注冊多個回調, 調用回調隊列,傳遞任何同步或異步函數(shù)的成功或失敗狀態(tài)。

beforeStart : 類型 Function( Deferred deferred ),一個構造函數(shù)返回之前調用的函數(shù)。

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

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

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

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

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

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

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

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

$.when() 為多個操作指定回調函數(shù)。

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

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

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

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

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

更多信息請參見 jQuery API中文文檔。

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

轉載請注明本文地址:http://systransis.cn/yun/103027.html

相關文章

  • jQuery源碼解析Deferred異步對象

    摘要:回調隊列對象,用于構建易于操作的回調函數(shù)集合,在操作完成后進行執(zhí)行。對象對象,用于管理回調函數(shù)的多用途列表。如果傳入一個延遲對象,則返回該對象的對象,可以繼續(xù)綁定其余回調,在執(zhí)行結束狀態(tài)之后也同時調用其回調函數(shù)。 在工作中我們可能會把jQuery選擇做自己項目的基礎庫,因為其提供了簡便的DOM選擇器以及封裝了很多實用的方法,比如$.ajax(),它使得我們不用操作xhr和xdr對象,直...

    Coding01 評論0 收藏0
  • Promise介紹--DeferredjQuery

    摘要:我們稱為回調對象,它內部會維護一個數(shù)組,我們可以向其中添加若干個回調函數(shù),然后在某一條件下觸發(fā)執(zhí)行。第一次之后,再次新的回調函數(shù)時,自動執(zhí)行回調。當前面的回調函數(shù)返回時,終止后面的回調繼續(xù)執(zhí)行。 最近懶癌發(fā)作,說好的系列文章,寫了一半,一直懶得寫,今天補上一篇。 Deferred 我們在使用promise對象時,總會提到一個與它關系密切的對象——Deferred。其實Deferred沒...

    Darkgel 評論0 收藏0
  • 通過 ES6 Promise 和 jQuery Deferred 的異同學習 Promise

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

    Yujiaao 評論0 收藏0
  • jquery高級應用之Deferred對象

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

    tianren124 評論0 收藏0
  • jquery高級應用之Deferred對象

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

    monw3c 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<