使用promise報錯 動手實現乙個Promise

2021-10-12 21:34:30 字數 2265 閱讀 7684

這篇文章我們會通過手寫乙個符合 promise/a+ 規範的 promise 來深入理解它,並且手寫 promise 也是一道大廠常考題,在進入正題之前,推薦各位去網上找下promise/a+規範,這樣才能更好地理解這個章節的**。

在完成符合 promise/a+ 規範的**之前,我們可以先來實現乙個簡易版 promise,因為在面試中,如果你能實現出乙個簡易版的 promise 基本可以過關了。

那麼我們先來搭建構建函式的大體框架

const pending = 'pending'const resolved = 'resolved'const rejected = 'rejected'function mypromise(fn)
接下來我們來完善 resolve 和 reject 函式,新增在 mypromise 函式體內部

function resolve(value) }function reject(value) }
這兩個函式**類似,就一起解析了

完成以上兩個函式以後,我們就該實現如何執行 promise 中傳入的函式了

try  catch (e)
最後我們來實現較為複雜的 then 函式

// 該**目前在簡單版中會報錯// 只是作為乙個透傳的例子promise.resolve(4).then().then((value) => console.log(value))
new mypromise((resolve, reject) => , 0)}).then(value => )
以上就是簡單版 promise 實現,接下來一小節是實現完整版 promise 的解析,相信看完完整版的你,一定會對於 promise 的理解更上一層樓。

實現乙個符合 promise/a+ 規範的 promise

我們先來改造一下 resolve 和 reject 函式

接下來繼續改造 then 函式中的**,首先我們需要新增乙個變數 promise2,因為每個 then 函式都需要返回乙個新的 promise 物件,該變數用於儲存新的返回物件,然後我們先來改造判斷等待態的邏輯

接下來我們改造判斷執行態的邏輯

最後,當然也是最難的一部分,也就是實現相容多種 promise 的 resolutionprocedure 函式

function resolutionprocedure(promise2, x, resolve, reject) }
首先規範規定了 x 不能與 promise2 相等,這樣會發生迴圈引用的問題,比如如下**

let p = new mypromise((resolve, reject) => )let p1 = p.then(value => )
然後需要判斷 x 的型別

if (x instanceof mypromise) , reject)}
這裡的**是完全按照規範實現的。如果 x 為 promise 的話,需要判斷以下幾個情況:

如果 x 處於等待態,promise 需保持為等待態直至 x 被執行或拒絕

如果 x 處於其他狀態,則用相同的值處理 promise

當然以上這些是規範需要我們判斷的情況,實際上我們不判斷狀態也是可行的。

接下來我們繼續按照規範來實現剩餘的**

這一篇文章我們分別實現了簡單版和符合 promise/a+ 規範的 promise,前者已經足夠應付大部分面試的手寫題目,畢竟寫出乙個符合規範的 promise 在面試中不大現實。後者能讓你更加深入地理解 promise 的執行原理,做技術的深挖者。

動手寫乙個簡單的promise

promise 是非同步程式設計的一種解決方案,比傳統的解決方案 函式和事件 更合理和更強大。它由社群最早提出和實現,es6 將其寫進了語言標準,統一了用法,原生提供了promise物件。所謂promise,簡單說就是乙個容器,裡面儲存著某個未來才會結束的事件 通常是乙個非同步操作 的結果。從語法上...

JS 來實現乙個 Promise

promise 原始碼 this promise code refered to this blog var promise function fn function trytojson obj catch e return value function resolve newvalue else ...

用 Promise 實現乙個訊息佇列

在此篇部落格中,我們的需求如下 有乙個訊息排程器去操作傳送來訊息 但處理訊息花費的事件是不確定的,有多有少 訊息是不斷傳送過來的 這個時候就會出現一種情況 前一條訊息還未執行結束,後一條訊息就被傳送過來了 如果這個時候要求後一條訊息必須在前一條執行完才開始執行,該如何實現?sync function...