一文了解Promise使用與實現

哈哈哈hh發表於2021-09-16

工具與資源中心

幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源

https://developer.aliyun.com/tool/?spm=a1z389.11499242.0.0.65452413TeoOSk&utm_content=g_1000295017


前言

Promise 作為一個前端必備技能,不管是從專案應用還是面試,都應該對其有所瞭解與使用。

常常遇到的面試五連問:

  • 說說你對 Promise 理解?
  • Promise 的出現解決了什麼問題?
  • Promise 有哪些狀態?
  • 你用過 Promise 哪些方法?
  • 如何實現一個 Promise ?

什麼是 Promise?

Promise 是非同步程式設計的一種解決方案:從語法上講,promise 是一個物件,從它可以獲取非同步操作的訊息;從本意上講,它是承諾,承諾它過一段時間會給你一個結果。

Promise 有三種狀態: pending(等待態), fulfiled(成功態), rejected(失敗態);狀態一旦改變,就不會再變。創造 Promise 例項後,它會立即執行。

一般來說我們會碰到的回撥巢狀都不會很多,一般就一到兩級,但是某些情況下,回撥巢狀很多時,程式碼就會非常繁瑣,會給我們的程式設計帶來很多的麻煩,這種情況俗稱——回撥地獄。

這時候我們的 Promise 就應運而生、粉墨登場了。

Promise 的基本使用

Promise 是一個建構函式,自己身上有 allrejectresolve 這幾個眼熟的方法,原型上有 thencatch 等同樣很眼熟的方法。

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物件的多層巢狀展平。



本文轉自:https://developer.aliyun.com/article/791192?spm=a2c6h.12873581.0.0.6b4c767doF0yzX&groupCode=othertech


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2792341/,如需轉載,請註明出處,否則將追究法律責任。

相關文章