const PENDING = 'pending'//初始化
const RESOLVED = 'resolved'//完成
const REJECTED = 'rejected'//失敗
/*一個 Promise有以下幾種狀態(tài):
pending: 初始狀態(tài)嫡秕,既不是成功厢洞,也不是失敗狀態(tài)爱只。
fulfilled: 意味著操作成功完成邓梅。
rejected: 意味著操作失敗。*/
function Promise(excutor) {
/*executor是一個帶有resolve冲杀,
reject兩個參數(shù)的函數(shù)公罕,
Promise構(gòu)造函數(shù)執(zhí)行
時立即調(diào)用executor 函數(shù)*/
const self = this
self.status = PENDING
self.data = undefined
self.callbacks = []
function resolve(value) {
if(self.status!==PENDING) {
return
}
self.status = RESOLVED
self.data = value
if(self.callbacks.length>0){
setTimeout(()=>{
self.callbacks.forEach(item=>{
item.onResolved(value)
})
})
}
}
function reject(reason){
if(self.status!==PENDING) {
return
}
self.status = REJECTED
self.data = reason
if(self.callbacks.length>0){
setTimeout(()=>{
self.callbacks.forEach(item=>{
item.onRejected(reason)
})
})
}
}
try{
excutor(resolve,reject)
}catch (err) {
reject(err)
}
}
Promise.prototype.then = function(onResolved,onRejected){
onResolved = typeof onResolved === 'function'?onResolved:value => value
onRejected = typeof onRejected === 'function'?onRejected:reason => {throw reason}
/*判斷傳過來的是否是function棺聊,如果不是那就說明有結(jié)果了*/
const self = this
return new Promise((resolve,reject)=>{
function handle(callback) {
try{
/*執(zhí)行失敗或成功的回調(diào),
獲取值如果是promise對象那么繼續(xù)執(zhí)行then方法淹接,
如果有結(jié)果則resolve結(jié)果修改data十性,返回resolved狀態(tài)的promise,拋出錯誤
那么 then 返回的 Promise 也會成為rejected的promise*/
const result = callback(self.data)
if(result instanceof Promise){
result.then(resolve, reject)
}else{
resolve(result)
}
}catch (err) {
reject(err)
}
}
if(self.status===PENDING){
self.callbacks.push({
onResolved(){
handle(onResolved)
},
onRejected(){
handle(onRejected)
}
})
}else if(self.status===RESOLVED){
setTimeout(()=>{
handle(onResolved)
})
}else{
setTimeout(()=>{
handle(onRejected)
})
}
})
}
Promise.prototype.catch = function(onRejected){
return this.then(undefined,onRejected)
}
Promise.resolve = function (value) {
/*
返回一個狀態(tài)由給定value決定的Promise對象塑悼。
如果該值是thenable(即劲适,帶有then方法的對象),
返回的Promise對象的最終狀態(tài)由then方法執(zhí)行決定拢肆;
否則的話(該value為空减响,基本類型或者不帶then方法的對象),
返回的Promise對象狀態(tài)為fulfilled,并且將該value傳遞給對應(yīng)的then方法郭怪。
*/
return new Promise((resolve,reject)=>{
if(value instanceof Promise){
value.then(resolve,reject)
}else{
resolve(value)
}
})
}
Promise.reject = function (reason) {
/*返回一個狀態(tài)為失敗的Promise對象支示,并將給定的失敗信息傳遞給對應(yīng)的處理方法*/
return new Promise((resolve,reject)=>{
reject(reason)
})
}
Promise.all = function (promises) {
/*傳一個promise數(shù)組
返回一個promise讀對象,如果成功傳進(jìn)來的promises數(shù)組的執(zhí)行結(jié)果按傳進(jìn)
來的順序放在數(shù)組里鄙才,如果失敗就傳第一個失敗的原因
*/
return new Promise((resolve,reject)=>{
let flags = new Array(promises.length)
let count = 0
promises.forEach(
(item,index)=>{
item.then(
value => {
flags[index] = value
count++
if(count===promises.length){
resolve(flags)
}
},
reason => {
reject(reason)
}
)
}
)
})
}
Promise.race = function (promises) {
return new Promise((resolve,reject)=>{
/*
將第一個promise的結(jié)果進(jìn)行返回
*/
promises.forEach(
(item,index)=>{
item.then(
value => {
resolve(value)
},
reason => {
reject(reason)
}
)
}
)
})
}
手寫Promise
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門闲擦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慢味,“玉大人,你說我怎么就攤上這事墅冷〈柯罚” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵寞忿,是天一觀的道長驰唬。 經(jīng)常有香客問我,道長腔彰,這世上最難降的妖魔是什么叫编? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮萍桌,結(jié)果婚禮上宵溅,老公的妹妹穿的比我還像新娘。我一直安慰自己上炎,他們只是感情好恃逻,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藕施,像睡著了一般寇损。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裳食,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼着憨!你這毒婦竟也來了墩衙?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布惫恼,位于F島的核電站,受9級特大地震影響澳盐,放射性物質(zhì)發(fā)生泄漏祈纯。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一叼耙、第九天 我趴在偏房一處隱蔽的房頂上張望腕窥。 院中可真熱鬧,春花似錦筛婉、人聲如沸簇爆。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽入蛆。三九已至,卻和暖如春硕勿,著一層夾襖步出監(jiān)牢的瞬間哨毁,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 在前兩篇(手寫 Promise 系列 --- 1)和(手寫 Promise 系列 ---2) 中,達(dá)成了3個目標(biāo) ...
- 寫了好幾天凳枝,終于寫完了一個符合Promise A+ 規(guī)范的promise了,并且跑通了測試用例,改天再仔細(xì)講解吧....
- Promise標(biāo)準(zhǔn)了解一下 傳送門1?? ??Promises/A+規(guī)范 傳送門2?? ??阮一峰前輩ECMAScri...
- 1. promise要解決的問題: 腦筋急轉(zhuǎn)彎:把牛關(guān)進(jìn)冰箱里岖瑰,要分幾步叛买? 很顯然,這三個操作不能顛倒順序蹋订,否則任...
- 1. Promise A+ 規(guī)范 官方英文地址:https://promisesaplus.com/ 中文翻譯可參...