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

jQuery中deferred對象使用方法詳解

 更新時間:2016年07月14日 15:49:09   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了jQuery中deferred對象使用方法,也就是延遲對象的使用方法,感興趣的小伙伴們可以參考一下

在jquery1.5之后的版本中,加入了一個deferred對象,也就是延遲對象,用來處理未來某一時間點發(fā)生的回調(diào)函數(shù)。同時,還改寫了ajax方法,現(xiàn)在的ajax方法返回的是一個deferred對象。
那就來看看deferred對象的用法。
1.ajax的鏈?zhǔn)交卣{(diào) 

// ajax方法返回的是一個deferred對象,可以直接使用鏈?zhǔn)綄懛?
$.ajax('test.json').done(function(resp){
 // done 相當(dāng)于success回調(diào),其中默認(rèn)的參數(shù)為success回調(diào)的參數(shù)
 alert('success');
}).fail(function(){
 // fail 相當(dāng)于error回調(diào)
 alert('error');
});

還可以同時寫多個回調(diào),會按照順序依次執(zhí)行 

$.ajax('test.json').done(function(resp){
 // done 相當(dāng)于success回調(diào),其中默認(rèn)的參數(shù)為success回調(diào)的參數(shù)
 alert('success');
}).done(function(){
 // do something...
}).done(function(){
 // do something...
});

deferred對象還有一個then方法,其實它是一個整合done和fail的方法,它接受一到兩個參數(shù),如果有兩個參數(shù),那么第一個就是done方法的回調(diào)函數(shù),第二個是fail方法的回調(diào)函數(shù)。如果只有一個參數(shù),那就是done方法的回調(diào)函數(shù)。 

var success = function(){
 alert('success'); 
};

var error = function(){
 alert('error');
};

// 兩個參數(shù)
$.ajax('test.json').then(success, error);

// 一個參數(shù)
$.ajax('test.json').then(success);

jQuery還提供了一個$.when(deferreds)的方法來執(zhí)行一個或多個延遲對象的回調(diào)函數(shù),當(dāng)它的參數(shù)是延遲對象時,它會在所有延遲對象代表的異步執(zhí)行完后再執(zhí)行相應(yīng)的回調(diào)函數(shù) 

$.when($.ajax('test.json'), $.ajax('demo.json')) .done(function(){
 alert('success'); 
}).fail(function(){
 alert('error');
});

很好理解,只有當(dāng)所有異步都成功時,才會執(zhí)行done方法中的回調(diào),否則會執(zhí)行fail方法中的回調(diào),同樣好理解的是的done方法中回調(diào)函數(shù)的默認(rèn)參數(shù)數(shù)量則和when方法參數(shù)數(shù)量相同。
而如果when方法中傳入的只是普通對象,不是deferred對象時,會立即執(zhí)行done方法中的回調(diào),回調(diào)函數(shù)的默認(rèn)參數(shù)為傳入when方法的對象本身。

 // 當(dāng)傳入when方法的參數(shù)只是普通對象時
$.when({test: 'test'}).done(function(resp){
 console.log(resp.test); // 'test' 
}).fail(function(){
 // 由于傳入的對象不是deferred對象,那么就不會調(diào)用fail中的回調(diào)了 
}) 

當(dāng)你需要兩個甚至更多的異步結(jié)束后才調(diào)用回調(diào)函數(shù),同時這些異步ajax可能還需要修改傳輸方式type或者傳數(shù)據(jù)data時,代碼就顯得很亂,可讀性很差。 
所以就可以對ajax進行再次封裝,提高代碼可讀性 

var ajax = function(url, type, param){
 return $.ajax({
 url: url,
 type: type,
 data: param || {} 
 }); 
};

ajax('test.json').done(function(resp){
 alert('success');
}).fail(function(){
 alert('error');
});

接者學(xué)習(xí),漏了一個always()方法,參數(shù)也是回調(diào)函數(shù),與done和fail不同的是,無論任何情況都執(zhí)行always方法中的回調(diào)。
deferred對象不光可以用在jquery的ajax方法中,他提供了一系列的接口,使它的通用型大大提高。
比如有這樣一個耗時比較久的方法

 function a(){
 function b(){
 alert('start');
 } 
 setTimeout(b, 3000); 
} 

如果要在這個方法之后執(zhí)行某個回調(diào),就不能用$.when()了,因為當(dāng)$.when()的參數(shù)不為deferred對象是會直接調(diào)用done或者always中的回調(diào)函數(shù)。
這個時候就要使用deferred對象的其他方法了,還是上面的方法,做一些改寫 

function a(){
 var def = $.Deferred(); // 創(chuàng)建deferred對象 
 function b(){
 alert('start');
 def.resolve(); // 改變deferred對象的狀態(tài)
 } 
 setTimeout(b, 3000); 
 return def;
}

$.when(a()).done(function(){
 alert("It's callback");
});

分析一下:
 1). $.Deferred()方法會創(chuàng)建一個deferred對象
 2). def.resolve()會改變deferred對象的狀態(tài),deferred對象有三種狀態(tài),未完成,成功,失敗。
 它有resolve()和reject()兩個方法,resolve方法可以把對象狀態(tài)改為成功,reject方法可以把狀態(tài)改為失敗。
 又有以上的寫法會出現(xiàn)問題,返回的deferred對象可以被外部改變狀態(tài),所以還提供了一個promise()方法,這個方法會在deferred對象的基礎(chǔ)上返回一個新的deferred對象,不同的是,返回的對象只存在可被觀察到狀態(tài),而不具備可改變其狀態(tài)的方法,類似返回了一個只讀的deferred對象。
 所以同樣的例子可以改寫成這樣 

function a(){
 var def = $.Deferred(); // 創(chuàng)建deferred對象 
 function b(){
 alert('start');
 def.resolve(); // 改變deferred對象的狀態(tài)
 } 
 setTimeout(b, 3000); 
 return def.promise();
}

$.when(a().reject()).done(function(){ // reject()方法無效
 alert("It's callback");
});

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript中for..in循環(huán)陷阱介紹

    JavaScript中for..in循環(huán)陷阱介紹

    for...in循環(huán)中的循環(huán)計數(shù)器是字符串,而不是數(shù)字它包含當(dāng)前屬性的名稱或當(dāng)前數(shù)組元素的索引,下面有個不錯的示例大家可以參考下
    2013-11-11
  • JavaScript在IE和Firefox(火狐)的不兼容問題解決方法小結(jié)

    JavaScript在IE和Firefox(火狐)的不兼容問題解決方法小結(jié)

    今天測試代碼時,發(fā)現(xiàn)不少IE可以運行的ajax,但在FF中報錯。IE和Firefox(火狐)在JavaScript方面的不兼容及統(tǒng)一方法總結(jié)如下,需要的朋友可以看下,對于以后的代碼書寫一定要考慮到多瀏覽器的兼容性。
    2010-04-04
  • Javascript設(shè)置對象的ReadOnly屬性(示例代碼)

    Javascript設(shè)置對象的ReadOnly屬性(示例代碼)

    本篇文章主要介紹了Javascript設(shè)置對象的ReadOnly屬性(示例代碼) 需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • BootstrapValidator實現(xiàn)注冊校驗和登錄錯誤提示效果

    BootstrapValidator實現(xiàn)注冊校驗和登錄錯誤提示效果

    這篇文章主要為大家詳細(xì)介紹了Bootstrap Validator實現(xiàn)注冊校驗和登錄錯誤提示效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • typescript+react實現(xiàn)移動端和PC端簡單拖拽效果

    typescript+react實現(xiàn)移動端和PC端簡單拖拽效果

    這篇文章主要為大家詳細(xì)介紹了typescript+react實現(xiàn)移動端和PC端簡單拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 使用javascript提交form表單方法匯總

    使用javascript提交form表單方法匯總

    這篇文章主要介紹了通過a標(biāo)簽的超鏈接提交form表單方法匯總,十分的全面細(xì)致,也很實用,有需要的小伙伴可以參考下。
    2015-06-06
  • 解決微信內(nèi)置瀏覽器返回上一頁強制刷新問題方法

    解決微信內(nèi)置瀏覽器返回上一頁強制刷新問題方法

    微信內(nèi)置瀏覽器在返回上一頁面,且上一頁面包含AJAX代碼時,頁面就會被強制刷新,極度影響用戶體驗。而我們想要的效果是:返回上一頁面時,頁面還停留在原來的狀態(tài),AJAX獲取到的數(shù)據(jù)還在,滾動條也在原來的位置。下面跟著小編一起來看下吧
    2017-02-02
  • 微信小程序如何再次獲取用戶授權(quán)的方法

    微信小程序如何再次獲取用戶授權(quán)的方法

    這篇文章主要介紹了微信小程序如何再次獲取用戶授權(quán)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 弱類型語言javascript中 a,b 的運算實例小結(jié)

    弱類型語言javascript中 a,b 的運算實例小結(jié)

    這篇文章主要介紹了弱類型語言javascript中 a,b 的運算,結(jié)合實例形式總結(jié)分析了js閉包函數(shù)中布爾值與字符串的a,b運算相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • javascript類數(shù)組的深入理解

    javascript類數(shù)組的深入理解

    這篇文章主要給大家介紹了關(guān)于javascript類數(shù)組的深入理解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

三门峡市| 曲沃县| 海宁市| 灌云县| 邻水| 泽州县| 六安市| 甘洛县| 宁强县| 句容市| 舞钢市| 耒阳市| 南充市| 桑植县| 渑池县| 池州市| 涡阳县| 河曲县| 新巴尔虎右旗| 永靖县| 若羌县| 资阳市| 临沭县| 抚远县| 广西| 陇西县| 凤翔县| 龙州县| 梁山县| 辛集市| 称多县| 中方县| 朝阳县| 青神县| 二连浩特市| 霍州市| 通江县| 射阳县| 小金县| 长春市| 凤凰县|