国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:25:03
字體:
供稿:網(wǎng)友

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

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

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

一、封裝異步操作

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

 

 
  1. //加載圖片函數(shù) 
  2. var loadImg = function(url){ 
  3.   var img = new Image() , deferred = $.Deferred() ; 
  4. img.src = url ; 
  5. img.onload = function(){ 
  6. //成功則觸發(fā)deferred.resolve 
  7.     deferred.resolve( this ) ; 
  8. } ; 
  9. img.onerror = function(e){ 
  10.     //失敗則觸發(fā)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. //可以注冊多個回調(diào),當(dāng)請求成功時,會按注冊的順序執(zhí)行,fail和always也有此性質(zhì) 
  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返回。使用這樣的方式,相比用對外暴露回調(diào)的方式,顯得更干凈、更清晰。這么做的另一個更重要的原因是,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執(zhí)行成功時 連接request1 
  8.   var request1 = loadImg('http://b1.hucdn.com/upload/item/1410/19/29492535741725_800x800.jpg') ; 
  9.   return request1 ; 
  10. },function(e){ 
  11.   //request執(zhí)行失敗時 連接request2 
  12.   var request2 = loadImg('http://b1.hucdn.com/upload/item/1410/19/29492535741725_800x800.jpg') ; 
  13.   return request2 ; 
  14. }); 
  15. //request執(zhí)行并且request1或request2成功執(zhí)行時 
  16. request3.done(function(done){ 
  17.   //code 
  18. }) ; 

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

同時,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這個函數(shù),它可以接受n個promise對象為參數(shù),它是將promise的執(zhí)行結(jié)果連接在一起。使用這種方式,多個異步操作可以并行執(zhí)行。

三、The End

這里的代碼是以加載圖片為例,同樣的做法可以應(yīng)用到其他的異步操作中去。比如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ù)可以用于定義當(dāng)數(shù)據(jù)已經(jīng)全部加載到頁面的觸發(fā)時機和觸發(fā)邏輯,notify和progress函數(shù)可以用于定義瀑布流讀取下一頁的觸發(fā)時機和觸發(fā)邏輯。


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

圖片精選

主站蜘蛛池模板: 玛多县| 桂平市| 石林| 镇远县| 重庆市| 通州区| 孟津县| 尼木县| 新余市| 伊金霍洛旗| 无为县| 汶川县| 金塔县| 上栗县| 昆明市| 黄骅市| 漯河市| 黑龙江省| 鄂州市| 离岛区| 化州市| 榆社县| 黎平县| 奎屯市| 津南区| 依兰县| 华安县| 兴文县| 普洱| 龙里县| 岳阳县| 潜江市| 华容县| 宝坻区| 衢州市| 锡林浩特市| 霍林郭勒市| 马尔康县| 正安县| 侯马市| 邯郸市|