搜尋
首頁web前端js教程以jQuery中$.Deferred物件為例講解promise物件是如何處理非同步問題_jquery

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

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

一、封裝非同步操作

  首先,我們以載入圖片為例,看以下程式碼:

//加载图片函数
var loadImg = function(url){
  var img = new Image() , deferred = $.Deferred() ;
 img.src = url ;
 img.onload = function(){
  //成功则触发deferred.resolve
    deferred.resolve( this ) ;
 } ;
 img.onerror = function(e){
    //失败则触发deferred.reject
  deferred.reject( e );
 } ;
  //返回promise对象
 return deferred.promise() ;
} ;
//请求图片
var request = loadImg('http://r2.ykimg.com/0515000054AFFC2D6737B343930AFAD6') ;
//请求成功
request.done(function(img){
  //code
}) ;
//可以注册多个回调,当请求成功时,会按注册的顺序执行,fail和always也有此性质
request.done(function(img){
  // code
});
//请求失败
request.fail(function(){
  // code
}) ;
//请求完毕
request.always(function(){
  //code
});

以上的程式碼,我封裝了圖片載入的操作,將他們委託給$.Deferred,最後產生一個promise回傳。使用這樣的方式,相較於用對外暴露回調的方式,顯得更乾淨、更清晰。這麼做的另一個更重要的原因是,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执行成功时 连接request1
  var request1 = loadImg('http://b1.hucdn.com/upload/item/1410/19/29492535741725_800x800.jpg') ;
  return request1 ;
},function(e){
  //request执行失败时 连接request2
  var request2 = loadImg('http://b1.hucdn.com/upload/item/1410/19/29492535741725_800x800.jpg') ;
  return request2 ;
});
//request执行并且request1或request2成功执行时
request3.done(function(done){
  //code
}) ;

 promise物件提供了then的方法,它接受兩個回呼:onResolve和onReject,在回呼中返回promise,就可以完成promise之間的連接。透過這種方式,可以使非同步操作串列的執行。

  同時,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這個函數,它可以接受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函數可以用來定義瀑布流讀取下一頁的觸發時機和觸發邏輯。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript數據類型:瀏覽器和nodejs之間是否有區別?JavaScript數據類型:瀏覽器和nodejs之間是否有區別?May 14, 2025 am 12:15 AM

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScript評論:使用//和 / * * / * / * /JavaScript評論:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具