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...