promise
與async/await
是es6中常用的非同步操作方法,為了深刻理解promise
的用法,解讀原始碼是乙個很好的方案。其核心方法是promise
建構函式,以及.then
方法,其他靜態方法都是在此基礎之上封裝的
為了方便理解,以下**經過了適當刪減
// promise狀態常量值
// 狀態還未變化
const
pending=0
// 成功
const
fullfilled=1
// 失敗
const
rejected=2
function
mypromise
(executor))}
}const
reject
=(error)
=>)}
}try
) 中的function
// 從這裡也能看出 excutor 是同步執行
excutor
(resolve, reject)
}catch(e
)}
接下來是新增原型鏈方法.then
// 構造器建好後,新增原型鏈方法
mypromise.prototype =
/** * promise支援.then().then()這種鏈式呼叫,所以then()的返回值也應是乙個promise物件
* 由於promise存在前面的then執行成功,後面的then執行失敗的情況
* 所以不能返回當前狀態已經固定的this,而是返回乙個新的promise
*/let p2 =
newpromise
((resolve, reject)
=>
else
// 對result進行解析,直到最終執行resolve(obj)或reject(err)
// obj為result最後返回的那個物件
resolvepromise
(result, resolve, reject)}if
(this
.state ===
rejected
)else
// 對error進行解析,直到最終執行reject(err)
resolvepromise
(error, resolve, reject)}if
(this
.state ===
pending
)else
resolvepromise
(result, resolve, reject)})
this
.onrejectedcallbacks.
push((
)=>
else
resolvepromise
(error, resolve, reject)})
}})return p2
}}
/**
* 判斷乙個物件是否為promise物件
* 判斷他是否擁有then方法
*/function
ispromise
(obj)
}return
false
}
// 這個方法的目的,是解析result中的data
// 並最終執行外層p2的resolve或reject方法
function
resolvepromise
(result, resolve, reject)
, j=>{})
then.
call
(result, r =>
, j =>)}
catch(e
)}else
}
其他promise方法都是上述的乙個封裝
mypromise.prototype.catch(errorfn)
mypromise.prototype.
catch
=function
(errorfn)
mypromise.resolve(data)
mypromise.
resolve
=function
(data)
)}
mypromise.reject(error)
mypromise.
reject
=function
(error)
)}
mypromise.all([...promiseobj])
/**
* 所有promise執行成功後,返回整個列表
* 如果有失敗的,返回最先失敗的結果
*/mypromise.
all=
function
(promiseobj =
)}).
catch
(err =>)}
else
}// 如果沒有非同步資料
if(index ===0)
})}
mypromise.race([...promiseobj])
/**
* 誰先執行完成返回誰,不管是成功還是失敗
*/mypromise.
race
=function
(promiseobj=
)else}}
)}
手寫promise封裝ajax
其實,axios本身就是基於promise進行封裝的,我們之所以進行二次封裝,主要是為了能夠對錯誤資訊進行乙個集中的處理,根據不同的錯誤資訊,需要給使用者不同的提示,以便於給使用者乙個良好的操作體驗。封裝方法有很多種,基於class類的,基於建構函式的,也可以直接封裝乙個函式。具體按照個人習慣,最主...
手寫Promise實現過程
手寫promise實現過程 定義好mypromise的三種狀態,用三個常量來接收 const pending pending 等待 const fulfilled fulfilled 成功 const rejected rejected 失敗 class mypromise catch e mypr...
手寫乙個Promise
js物件導向 在js中一切皆物件,但js並不是一種真正的物件導向 oop 的語言,因為它缺少類 class 的概念。雖然es6引入了class和extends,使我們能夠輕易地實現類和繼承。但js並不存在真實的類,js的類是通過函式以及原型鏈機制模擬的,本小節的就來 如何在es5環境下利用函式和原型...