介紹jquery 的deferred由來
它是jquery1.5版本的新出的功能,為了解決異步回調(diào)的問題。大概2011年就出來了。現(xiàn)在es6規(guī)范中的promise,基本和deferred對象是一個概念。
定義deferred對象
var deferred1 = $.Deferred();//這樣就創(chuàng)建了一個deferred對象
deferred.done(sucessfn); //定義d1成功后的回調(diào)函數(shù)
deferred.fail(failfn); //定義d1失敗后的回調(diào)函數(shù)
每一個deferred對象,有三種狀態(tài)
- 正在處理中:
- 成功狀態(tài):
- 失敗狀態(tài):
當(dāng)deferred對象被resolve/reject觸發(fā)之后,就會改變狀態(tài),然后調(diào)用不同狀態(tài)下的函數(shù)。
//從正在處理的狀態(tài)變?yōu)槌晒顟B(tài),callback done,
deferred1.resolve();
//從正在處理的狀態(tài)變?yōu)槭顟B(tài),callback fail,
deferred1.reject();
以上就是deferred的基本用法,簡單說來。就是可以讓我們認(rèn)為控制一個對象成功失敗的狀態(tài)。看到這里,好像沒覺得它有多牛逼。
deferred對象解決了什么問題?~~
1.ajax對象,易讀性
-
jquery1.5版本重寫了$.ajax對象,$.ajax的返回值全是deferred對象。用done和fail來表示成功或者失敗。
var deferred2 = $.ajax("test.html") .done(function(){ alert("哈哈,成功了!"); }) .fail(function(){ alert("出錯啦!"); });
-
為一個deferred對象,添加多個回調(diào)處理函數(shù),且按照添加的順序執(zhí)行
deferred2.done(sucessfn 1) .done(sucessfn 2)
-
解決異步金字塔回調(diào) $.when()
想想這樣的業(yè)務(wù)場景,有三個及以上異步請求的時候,如何保證3個請求都成功之后,在執(zhí)行一個函數(shù)呢?$.ajax({ success: $.ajax({}) //只能通過回調(diào)成功的函數(shù)里,嵌套ajax請求 }) //通過計數(shù)器來實現(xiàn),但是每個回調(diào)成功的函數(shù),都要檢查當(dāng)前的計數(shù) var flag = 0; $.ajax({ success: flag++ if(flag == 3){ //3個請求已成功 } }) //只有當(dāng)兩個ajax都成功的時候,才調(diào)用done的回調(diào)函數(shù)。 $.when($.ajax1,$.ajax2) .done(f1) .fail(f2)
特別注意:when函數(shù),只接受deferred對象哦!!!!
-
簡單寫法 then方法,直接把done狀態(tài)和fail狀態(tài)都寫進(jìn)去
deferred1.then(donefunc,failfunc);