手寫乙個Promise(3)

2021-10-02 20:19:05 字數 2232 閱讀 3161

then還沒有寫好。。。

then的鏈式處理我們要對reject做一定的修改。

if

(this

.status === eswang.

fufilled

)catch

(error)}

);}

我們可以看到,fufilled狀態中,catch的reject使用的是新new的reject,而不是then中的函式引數。

同樣需要這樣操作的還有rejected和pending中的狀態。

之前講promise的三個特性,穿透能力是很重要的一部分。如果我們中間乙個then沒有做任何處理和返回,這個then會被直接穿透。但是我們的**並沒有實現這個效果。

這個我們只需要在判斷then的傳參時把空傳參的返回值給上就可以了:

if

(typeof onfufilled !==

"function")if

(typeof onreject !==

"function"

)

let p =

neweswang

((res, rej)

=>);

p.then

( v =>);

},v =>).

then

(v =>

);

由於resolve直接把拿到的引數賦值給了this.val,而對於我們new 的promise,它的

let result =

onfufilled

(val)

;resolve

(result)

;

result中拿到的是乙個我們的promise物件,因此:

pre

eswang

對此,我們需要判斷then的返回型別。

if

(this

.status === eswang.

fufilled),

reason =>);

}else

resolve

(result);}

catch

(error)}

);}

檢測result的原型鏈上是不是有eswang這個型別,如果是則對這個返回值呼叫thenf方法取出該值,如果不是,則直接返回。

同時我們也可以做一定的簡寫:

let result =

onfufilled

(this

.val);if

(result instanceof

eswang

)else

resolve

(result)

;

其他的狀態也要改變。

上面重複**有點多,我們可以封裝一下:

parse

(promise, result, resolve, reject)

else

resolve

(result);}

catch

(error

)}

然後呼叫的時候注意:

if

(this

.status === eswang.

fufilled))

;}

還有個需要注意的是promise then方法返回自身時會報錯的:

let p =

neweswang

((res, rej)

=>);

let a = p.

then

(v =>

);

所以我們要對上面的封裝再稍微修改一下:

parse

(promise, result, resolve, reject)

tryelse

resolve

(result);}

catch

(error

)}

同時呼叫的時候也要注意:

if

(this

.status === eswang.

rejected))

;}

手寫乙個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)

promise作為目前最受歡迎的js非同步程式設計解決方案,重要性不言而喻,今天就來實現乙個自己的promise。首先宣告類,新增幾個靜態屬性代表promise的狀態 class eswang 接著寫建構函式,主要是兩個類屬性,乙個代表狀態,使用剛剛的靜態屬性,乙個代表promise的值,初始為nu...