手寫乙個Promise(1)

2021-10-02 20:02:22 字數 1727 閱讀 6384

promise作為目前最受歡迎的js非同步程式設計解決方案,重要性不言而喻,今天就來實現乙個自己的promise。

首先宣告類,新增幾個靜態屬性代表promise的狀態:

class

eswang

接著寫建構函式,主要是兩個類屬性,乙個代表狀態,使用剛剛的靜態屬性,乙個代表promise的值,初始為null。

constructor

(executor)

catch

(error

)}

注意這裡如果建構函式執行過程中報錯我們要用reject方法直接處理,所以要用try-catch包裹一下。

上面在建構函式中的executor輸入了兩個方法,但是這裡還沒有定義:

resolve

(value)

}reject

(reason)

}

需要注意的是,為了保證promise狀態只能由:

pending=>fullfilled

pending=>rejected

因此我們要在resolve和reject方法中加乙個判斷,如果狀態不是』pending』的話,兩個方法引數是不會執行的。

最後注意一下executor中要bind一下,不然我們執行:

let p =

neweswang

((res)

=>

)

時,由於new過程當前上下文是window,res執行過程中this指向的是undifned,所以會報錯,因從我們要bind一下。

最基本的then包括對fullfill和reject兩個狀態的處理:

then

(onfufill, onreject)

catch

(error)}

elseif(

this

.status === eswang.

rejected

)catch

(error)}

}

但是我們這樣實現有什麼問題呢?

首先,如果我們建立promise時執行的是reject,我們傳遞then時本應該這樣傳:

let p =

neweswang

((res, rej)

=>)p.

then((

)=>

, v=>console.

log(v)

)

但是眾所周知,我們寫then的時候沒有這麼寫的,因此then方法要做修改:

then

(onfufilled, onreject);}

if(typeof onreject !==

"function");

}...

}

這樣一來到是不會報錯了,但是還有明顯的問題。

剛剛的**有幾處明顯的問題,我們先看第一點,就是then方法中的**是同步執行的,要改變這個也很簡單,我們使用settimeout包裹即可解決:

if

(this

.status === eswang.

fufilled

)catch

(error)}

);}

手寫乙個Promise

js物件導向 在js中一切皆物件,但js並不是一種真正的物件導向 oop 的語言,因為它缺少類 class 的概念。雖然es6引入了class和extends,使我們能夠輕易地實現類和繼承。但js並不存在真實的類,js的類是通過函式以及原型鏈機制模擬的,本小節的就來 如何在es5環境下利用函式和原型...

手寫乙個promise

promise a 規範 注 以下 沒有通過promises aplus tests的全部測試,但基本功能還是全的 測試結果 864 passing,8 failing 另外可以參考這個指南中的 promise實現 promise resolve 100 規範 class mypromise con...

promise 1 高階函式

如果乙個函式的引數是函式 如果乙個函式返回乙個函式 typeof costructor 可以找到是誰構造出來的 instanceof 判斷是誰的例項 proto object.prototype.tostring.call 最靠譜的判斷方式 封裝判斷資料型別的方法 function istype t...