亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

以jQuery中$.Deferred對象為例講解promise對象是如何處理異步問題

2024-05-06 16:25:03
字體:
來源:轉載
供稿:網友

Promises是一種令代碼異步行為更加優雅的抽象,它很有可能是JavaScript的下一個編程范式,一個Promise即表示任務結果,無論該任務是否完成。本文以jQuery中$.Deferred對象為例講解promise對象是如何處理異步問題,需要的朋友參考下

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

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

一、封裝異步操作

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

 

 
  1. //加載圖片函數 
  2. var loadImg = function(url){ 
  3.   var img = new Image() , deferred = $.Deferred() ; 
  4. img.src = url ; 
  5. img.onload = function(){ 
  6. //成功則觸發deferred.resolve 
  7.     deferred.resolve( this ) ; 
  8. } ; 
  9. img.onerror = function(e){ 
  10.     //失敗則觸發deferred.reject 
  11. deferred.reject( e ); 
  12. } ; 
  13.   //返回promise對象 
  14. return deferred.promise() ; 
  15. } ; 
  16. //請求圖片 
  17. var request = loadImg('http://r2.ykimg.com/0515000054AFFC2D6737B343930AFAD6') ; 
  18. //請求成功 
  19. request.done(function(img){ 
  20.   //code 
  21. }) ; 
  22. //可以注冊多個回調,當請求成功時,會按注冊的順序執行,fail和always也有此性質 
  23. request.done(function(img){ 
  24.   // code 
  25. }); 
  26. //請求失敗 
  27. request.fail(function(){ 
  28.   // code 
  29. }) ; 
  30. //請求完畢 
  31. request.always(function(){ 
  32.   //code 
  33. }); 

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

二、promise的連接

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

 

 
  1. var request = loadImg('http://b1.hucdn.com/upload/item/1411/13/89613257775992_800x800.jpg') ; 
  2. request.done(function(img){ 
  3.   //code 
  4. }) ; 
  5. //request連接別的promise之后返回的promise 
  6. var request3 = request.then(function(img){ 
  7.   //request執行成功時 連接request1 
  8.   var request1 = loadImg('http://b1.hucdn.com/upload/item/1410/19/29492535741725_800x800.jpg') ; 
  9.   return request1 ; 
  10. },function(e){ 
  11.   //request執行失敗時 連接request2 
  12.   var request2 = loadImg('http://b1.hucdn.com/upload/item/1410/19/29492535741725_800x800.jpg') ; 
  13.   return request2 ; 
  14. }); 
  15. //request執行并且request1或request2成功執行時 
  16. request3.done(function(done){ 
  17.   //code 
  18. }) ; 

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

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

 

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

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

三、The End

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

附:deferred對象

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

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

在實現瀑布流時,resolve和done函數可以用于定義當數據已經全部加載到頁面的觸發時機和觸發邏輯,notify和progress函數可以用于定義瀑布流讀取下一頁的觸發時機和觸發邏輯。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲а∨天堂久久精品9966| 亚洲欧洲日韩国产| 一区二区亚洲精品国产| 国产97在线观看| 91影视免费在线观看| 亚洲成人久久一区| 黑人巨大精品欧美一区二区| 欧美理论电影在线播放| 欧美成人精品在线| 午夜精品蜜臀一区二区三区免费| 亚洲性生活视频在线观看| 欧美性受xxx| 这里只有精品在线观看| 亚洲精品国产品国语在线| 欧美影院久久久| 亚洲视频在线观看视频| 尤物九九久久国产精品的分类| 精品高清美女精品国产区| 精品视频在线观看日韩| 久久久精品免费视频| 国产精品久久久久免费a∨大胸| 久久久免费av| 欧美高清第一页| 久久久久久网站| 日韩av影视综合网| 超碰日本道色综合久久综合| 蜜臀久久99精品久久久无需会员| 国产精品高清在线| 亚洲一区二区少妇| 欧美一区二区三区免费观看| 日韩精品黄色网| 2019国产精品自在线拍国产不卡| 亚洲网址你懂得| 78m国产成人精品视频| 夜夜嗨av色综合久久久综合网| 欧美午夜激情视频| 日韩免费av在线| 中文字幕精品在线视频| 国产区精品在线观看| 国产精品va在线| 欧美日韩成人精品| 亚洲精品日韩久久久| 日韩中文字幕免费视频| 视频在线观看99| 亚洲欧美精品中文字幕在线| 中文字幕亚洲欧美在线| 亚洲97在线观看| 亚洲精品美女久久| 亚洲国产成人精品久久| 国产精品v片在线观看不卡| 日韩精品免费在线播放| 日韩在线观看网站| 精品视频在线播放色网色视频| 欧美性猛交视频| 国产亚洲欧美一区| 精品自拍视频在线观看| 亚洲激情电影中文字幕| 欧美激情videoshd| 中文字幕在线看视频国产欧美| 午夜精品视频在线| 97精品久久久| 性色av一区二区三区红粉影视| 久久天天躁狠狠躁夜夜爽蜜月| 欧美大片在线看免费观看| 亚洲电影免费观看高清| 欧美精品videosex牲欧美| 亚洲自拍小视频免费观看| 国产精品午夜一区二区欲梦| 91精品久久久久久| 欧美黑人狂野猛交老妇| 欧洲s码亚洲m码精品一区| 久久综合色88| 亚洲久久久久久久久久| 黑人巨大精品欧美一区二区| 国产香蕉97碰碰久久人人| 国产一区二区日韩精品欧美精品| 成人黄色免费片| 97精品久久久| 97在线视频观看| 日韩精品中文字幕在线播放| 亚洲的天堂在线中文字幕| 欧美丰满少妇xxxxx| 亚洲18私人小影院| 欧美人与物videos| 国产精品v片在线观看不卡| 日日骚av一区| 亚洲精品短视频| 亚洲性夜色噜噜噜7777| 欧美日韩第一视频| 国产中文字幕日韩| 欧美精品videosex性欧美| 欧美性xxxxhd| 亚洲视频在线看| 欧美高清视频一区二区| 欧美日韩999| 亚洲精品久久久久久久久久久| 91精品91久久久久久| 精品国产欧美一区二区五十路| 一区二区三区视频免费在线观看| 国产精品白嫩初高中害羞小美女| 热久久这里只有精品| 亚洲字幕在线观看| 26uuu另类亚洲欧美日本一| 26uuu国产精品视频| 91香蕉嫩草神马影院在线观看| 国产精品色悠悠| 国产在线播放91| 国产精品91久久久久久| 国产成人福利网站| 欧美插天视频在线播放| 日韩电影中文字幕| 国产一区二中文字幕在线看| 国产成人小视频在线观看| 日韩欧美aⅴ综合网站发布| 成人免费在线网址| 亚洲第一偷拍网| 国产日韩精品在线播放| 国产精品免费久久久久久| 日韩电影中文字幕在线| 久久综合国产精品台湾中文娱乐网| 国产深夜精品福利| 亚洲国产精品久久91精品| 午夜精品国产精品大乳美女| 亚洲天堂第二页| 日韩三级成人av网| 隔壁老王国产在线精品| 一本大道香蕉久在线播放29| 亚洲美女动态图120秒| 精品少妇v888av| 亚洲国产精品久久久久久| 色噜噜久久综合伊人一本| 国产免费一区视频观看免费| 国精产品一区一区三区有限在线| 亚洲跨种族黑人xxx| 97香蕉久久超级碰碰高清版| 一区二区三欧美| 国产成人精品在线视频| 欧美综合第一页| 成人www视频在线观看| 97香蕉久久超级碰碰高清版| 日本韩国在线不卡| 欧美在线视频一二三| 欧美国产日韩一区二区| 国产精品丝袜一区二区三区| 亚洲欧洲偷拍精品| 欧美极品在线视频| 国产精品一区av| 国产mv免费观看入口亚洲| 精品中文字幕在线观看| 91精品久久久久久久久久另类| 亚洲人成亚洲人成在线观看| 97视频在线观看亚洲| 欧美激情中文字幕在线| 91在线免费视频| 丝袜美腿精品国产二区| 欧美精品一区在线播放| 国内精品免费午夜毛片| 亚洲成人激情在线观看| 国产一区二区丝袜高跟鞋图片| 亚洲欧洲日产国码av系列天堂| 午夜精品久久久久久99热软件| 日韩在线观看网址| 91国在线精品国内播放| 久久久噜噜噜久久中文字免|