文/大白老師
圖/大白老師
小夥伴們,大家好!本期大白老師將帶大家走近Promise對象。
Promise是ES6語法中新增的一個對象,主要為JavaScript異步編程提供一種解決方案。也許有人會問,為什麼要專門為JavaScript提供一種異步編程的解決方案啊?這是由JavaScript天生缺陷造成的。JavaScript本身是一種單線程程式語言,不支持多線程,所以,很多時候,需要使用異步來平衡這種先天的不足。
01
一、Promise的內容
閒言少敘,先粗暴地上一張圖,來直觀感受一下Promise:
通過上面這張圖,我們不難看出,Promise自身是一個構造函數,身上綁定有all、reject、resolve等一些列可以直接使用的方法,原型上有then、catch等處理異步的底層方法。這樣來說,在使用Promise的時候,我們只需要通過new關鍵字來創建新對象就可以了!
02
對比演示
傳統回調演示:
上述案例中,不難看出有兩個參數,參數一是a,參數二是一個函數。判斷條件為a大於10 且參數二是一個函數時,執行func2這個函數。
Promise回調演示:
通過上面兩個案例對比,我們不難發現Promise的優點:
1、Promise對象的狀態不受外界影響。
Promise對象有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態,這也是Promise這個名字的由來,它翻譯過來是「承諾」的意思,表示其他手段無法改變。
2、一旦狀態改變,就不會再變,任何時候都可以得到這個結果。
Promise對象的狀態改變,只有兩種可能:
從pending變為fulfilled和從pending變為rejected,只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型);
如果改變已經發生了,你再對Promise對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同。事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。
03
Promise參數
Promise對象實例會接收兩個參數:resolve、reject。這兩個參數本身就是函數,是由JavaScript提供的,開發人員不需要自行部署。
resolve函數的作用是將Promise對象的狀態從「未完成」變為「成功」,在異步操作成功時調用,並將異步操作的結果作為參數傳遞出去。
reject函數則是將promise對象的狀態由「未完成」變為「失敗」,在異步操作失敗時調用,並作為參數傳遞出去。
此外Promise對象除了這兩個參數外,其實例對象還有還有兩個方法供使用,即then()方法和catch()方法。then()方法是調用成功時的回調函數,catch()方法用於指定發生錯誤時的回調函數。
這裡特別需要強調一下,then()方法返回的是一個Promise實例對象,因此可以採用鏈式調用,即then()方法後面再調用另一個then()方法。
鏈式調用實例:
04
總結
通過上述案例,我們不難發現,promise在處理異步操作時,更多地只是在關注數據狀態的變化。也就是說,只關注數據是回調成功還是失敗,對於其他的,則忽略。另外Promise的鏈式調用可以避免真實開發過程中回調地域的問題,提高代碼的可讀性與可維護性。
德雲IT學院,
致力於培養IT技術緊缺型人才,
教育之路,道阻且長,
我們期待與你進行思維的碰撞。
德雲IT學院
因為專注,所以專業!
德雲致力於為網際網路行業提供人才
打通了企業招聘和人才就業的雙向渠道
對標一線網際網路大廠崗位需求
培養高端IT技能緊缺型人才
是學員和企業信賴的IT職業教育機構