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