成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術(shù)教程 ? 以jQuery中$.Deferred對象為例講解promise對象是如何處理異步問題
全站頭部文字 我要出現(xiàn)在這里
以jQuery中$.Deferred對象為例講解promise對象是如何處理異步問題 723 2024-03-21   

Promises是一種令代碼異步行為更加優(yōu)雅的抽象,它很有可能是JavaScript的下一個編程范式,一個Promise即表示任務結(jié)果,無論該任務是否完成。

在一些現(xiàn)代瀏覽器中已經(jīng)提供了原生的Promise對象,其遵循Promise/A+標準。在jQuery1.5+,提供了$.Deferred(其可以被轉(zhuǎn)化為promise對象)。很多知名的框架中,也提供了promise對象。promise對象在javascript中已經(jīng)是一種很重要的模式,它在解決異步問題時表現(xiàn)出的優(yōu)雅,正是javascript所需要的。以下以jQuery中的$.Deferred對象為例,來看一下promise對象是如何處理異步問題。關(guān)于$.Deferred對象,可以到jQuery官網(wǎng)查看,這里就不贅述了。

一、封裝異步操作

  首先,我們以加載圖片為例,看以下代碼:

//加載圖片函數(shù)
var loadImg = function(url){
  var img = new Image() , deferred = $.Deferred() ;
 img.src = url ;
 img.onload = function(){
  //成功則觸發(fā)deferred.resolve
    deferred.resolve( this ) ;
 } ;
 img.onerror = function(e){
    //失敗則觸發(fā)deferred.reject
  deferred.reject( e );
 } ;
  //返回promise對象
 return deferred.promise() ;
} ;
//請求圖片
var request = loadImg('http://r2.ykimg.com/0515000054AFFC2D6737B343930AFAD6') ;
//請求成功
request.done(function(img){
  //code
}) ;
//可以注冊多個回調(diào),當請求成功時,會按注冊的順序執(zhí)行,fail和always也有此性質(zhì)
request.done(function(img){
  // code
});
//請求失敗
request.fail(function(){
  // code
}) ;
//請求完畢
request.always(function(){
  //code
});

以上的代碼,我封裝了圖片加載的操作,將他們委托給$.Deferred,最后生成一個promise返回。使用這樣的方式,相比用對外暴露回調(diào)的方式,顯得更干凈、更清晰。這么做的另一個更重要的原因是,promise的連接。

二、promise的連接

  我們還是以上面圖片加載的代碼為例,來看一下如何做promise的連接,看以下代碼:

var request = loadImg('http://b1.hucdn.com/upload/item/1411/13/89613257775992_800x800.jpg') ;
request.done(function(img){
  //code
}) ;
//request連接別的promise之后返回的promise
var request3 = request.then(function(img){
  //request執(zhí)行成功時 連接request1
  var request1 = loadImg('http://b1.hucdn.com/upload/item/1410/19/29492535741725_800x800.jpg') ;
  return request1 ;
},function(e){
  //request執(zhí)行失敗時 連接request2
  var request2 = loadImg('http://b1.hucdn.com/upload/item/1410/19/29492535741725_800x800.jpg') ;
  return request2 ;
});
//request執(zhí)行并且request1或request2成功執(zhí)行時
request3.done(function(done){
  //code
}) ;

promise對象提供了then的方法,它接受兩個回調(diào):onResolve和onReject,在回調(diào)中返回promise,就可以完成promise之間的連接。通過這種方式,可以使異步操作串行的執(zhí)行。

  同時,jQuery還提供了另外一種連接方式,看代碼:

var request = loadImg('http://b1.hucdn.com/upload/item/1412/23/48188827139381_800x800.jpg') ;
var request1 = loadImg('http://b1.hucdn.com/upload/item/1412/06/50258594673502_800x800.jpg') ;
//通過$.when連接promise
var request2 = $.when(request,request1) ;
request2.done(function(img,img){
  //code
}) ;

  jQuery中提供了$.when這個函數(shù),它可以接受n個promise對象為參數(shù),它是將promise的執(zhí)行結(jié)果連接在一起。使用這種方式,多個異步操作可以并行執(zhí)行。

三、The End

  這里的代碼是以加載圖片為例,同樣的做法可以應用到其他的異步操作中去。比如jQuery中的$.ajax、$.fn.animate,調(diào)用它們返回的就是promise。在node端,也可以把一些異步操作(讀數(shù)據(jù)庫、讀文件等)封裝成promise。繼而對多個promise實現(xiàn)合并的操作,使其串行或者并行執(zhí)行。

附:deferred對象

  deferred除了用于轉(zhuǎn)化promise對象外,本身也是個很有用的對象。它除了提供像promise對象的那些方法和屬性外,還有notify函數(shù)和progress函數(shù),這兩個函數(shù)在實現(xiàn)進度條和瀑布流的時候,有很大的用處。

在實現(xiàn)進度條時,resolve和done函數(shù)可以用于定義進度條讀取到100%時的觸發(fā)時機和觸發(fā)邏輯,notify和progress函數(shù)可以用于定義進度條在讀取中的觸發(fā)時機和觸發(fā)邏輯。reject和fail函數(shù)可以用于定義進度讀取失敗時的觸發(fā)時機和觸發(fā)邏輯。

在實現(xiàn)瀑布流時,resolve和done函數(shù)可以用于定義當數(shù)據(jù)已經(jīng)全部加載到頁面的觸發(fā)時機和觸發(fā)邏輯,notify和progress函數(shù)可以用于定義瀑布流讀取下一頁的觸發(fā)時機和觸發(fā)邏輯。



主站蜘蛛池模板: 美食总动员在线观看完整版免费| 管路通| 江西省旅游地图| 徐一航的电视剧叫什么| 明天属于我们法剧免费观看| 埃尔加,她狼| 山楂树之恋35集免费观看电视剧| 詹姆斯怀特| 谁的青春不迷茫 电影| 小妖怪的夏天| 贵州三日游| 红海行动2在线观看西瓜影院| 郑洋| 怒放的生命简谱| 裸体广场舞| 打龙袍全集免费观看| after4| 奖励员工的表扬通告怎么写| 科学试卷可打印(免费)| 诺比特电影免费观看完整版国语版| 抖音账号| 生死劫电影| 六级词汇电子版| 黄视频免费在线| 新家法| 乡村女教师乱淫交片| 意大利诱惑| 严正花电影| 爱来的刚好演员表| 洛嘉| 新一剪梅| 出轨的女人电影| 美女网站免费观看视频| 喜马拉雅听| 黄雀电视剧高清完整版| 欧美动作大片| 美女故事| 罗云熙的新剧《尸语者》哪里能看| 男同视频在线| 太太的情人电影| 十一码复式中奖表图片|

?。?!站長長期在線接?。?!

網(wǎng)站、小程序:定制開發(fā)/二次開發(fā)/仿制開發(fā)等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103