天天看點

一文了解Promise使用與實作

前言

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

的用法

我們知道Promise 對象除了then 方法,還有一個catch 方法,它是做什麼用的呢?其實它和then 的第二個參數一樣,用來指定reject 的回調。

resolve

的回調中,我們

console.log(test)

,而

test

這個變量是沒有被定義的。如果我們不用 Promise,代碼運作到這裡就直接在控制台報錯了,不往下運作了,也就是說進到catch方法裡面去了,而且把錯誤原因傳到了

reject

參數中。即便是有錯誤的代碼也不會報錯了,這與我們的

try/catch

語句有相同的功能。

finally

finally

方法傳回一個 Promise。在 promise 結束時,無論結果是 fulfilled 或者是 rejected ,都會執行指定的回調函數。這為在

Promise

是否成功完成後都需要執行的代碼提供了一種方式。

resolve

Promise.resolve(value)

方法傳回一個以給定值解析後的 Promise 對象。如果這個值是一個 promise ,那麼将傳回這個 promise ;如果這個值是 thenable(即帶有"then" 方法),傳回的promise會“跟随”這個 thenable 的對象,采用它的最終狀态;否則傳回的promise将以此值完成。此函數将類promise對象的多層嵌套展平。