前言
Promise 作為一個前端必備技能,不管是從項目應用還是面試,都應該對其有所了解與使用。
常常遇到的面試五連問:
- 說說你對 Promise 了解?
- Promise 的出現解決了什麼問題?
- Promise 有哪些狀态?
- 你用過 Promise 哪些方法?
- 如何實作一個 Promise ?
什麼是 Promise?
Promise 是異步程式設計的一種解決方案:從文法上講,promise 是一個對象,從它可以擷取異步操作的消息;從本意上講,它是承諾,承諾它過一段時間會給你一個結果。
Promise 有三種狀态:pending(等待态),fulfiled(成功态),rejected(失敗态);狀态一旦改變,就不會再變。創造 Promise 執行個體後,它會立即執行。
一般來說我們會碰到的回調嵌套都不會很多,一般就一到兩級,但是某些情況下,回調嵌套很多時,代碼就會非常繁瑣,會給我們的程式設計帶來很多的麻煩,這種情況俗稱——回調地獄。
這時候我們的Promise 就應運而生、粉墨登場了。
Promise 的基本使用
Promise 是一個構造函數,自己身上有
all
、
reject
resolve
這幾個眼熟的方法,原型上有
then
catch
等同樣很眼熟的方法。
Promise 的構造函數接收一個參數:函數,并且這個函數需要傳入兩個參數:
resolve:異步操作執行成功後的回調函數;
reject:異步操作執行失敗後的回調函數;
catch
的用法
catch
我們知道Promise 對象除了then 方法,還有一個catch 方法,它是做什麼用的呢?其實它和then 的第二個參數一樣,用來指定reject 的回調。
在
resolve
的回調中,我們
console.log(test)
,而
test
這個變量是沒有被定義的。如果我們不用 Promise,代碼運作到這裡就直接在控制台報錯了,不往下運作了,也就是說進到catch方法裡面去了,而且把錯誤原因傳到了
reject
參數中。即便是有錯誤的代碼也不會報錯了,這與我們的
try/catch
語句有相同的功能。
finally
finally
finally
方法傳回一個 Promise。在 promise 結束時,無論結果是 fulfilled 或者是 rejected ,都會執行指定的回調函數。這為在
Promise
是否成功完成後都需要執行的代碼提供了一種方式。
resolve
resolve
Promise.resolve(value)
方法傳回一個以給定值解析後的 Promise 對象。如果這個值是一個 promise ,那麼将傳回這個 promise ;如果這個值是 thenable(即帶有"then" 方法),傳回的promise會“跟随”這個 thenable 的對象,采用它的最終狀态;否則傳回的promise将以此值完成。此函數将類promise對象的多層嵌套展平。