长处:1. 反对链式调用,能够解决回调天堂问题
export default function Promise(executor) {
this.PromiseState = 'pending'
this.PromiseResult = null
this.callbacks = []
const self = this
function resolve(data) {if (self.PromiseState !== 'pending') return// 不可反复更改状态
self.PromiseState = 'fulfilled' // 批改状态
self.PromiseResult = data// 后果赋值
// 异步函数执行回调函数
setTimeout(()=>{
self.callbacks.forEach(item => {item.onResolved(data)
})
})
}
function reject(data) {if (self.PromiseState !== 'pending') return
self.PromiseState = 'rejected'
self.PromiseResult = data
setTimeout(()=>{
self.callbacks.forEach(item => {item.onRejected(data)
})
})
}
try {executor(resolve, reject)
} catch (error) {console.log('err' + error)
reject(error)
}
return executor(resolve, reject)
}
Promise.prototype.then = function (onResolved, onRejected) {
const self = this
if(typeof onRejected !=='function'){
onRejected = reason =>{throw reason}
}
if(typeof onResolved!=='function'){onResolved = value =>value}
return new Promise((resolve, reject) => {function callback(type) {
try {let result = type(self.PromiseResult)
if (result instanceof Promise) {
result.then(v => {resolve(v)
}, r => {resolve(r)
})
} else {resolve(result)
}
} catch (e) {reject(e)
}
}
if (this.PromiseState === 'fulfilled') {callback(onResolved)
} else if (this.PromiseState === 'rejected') {callback(onRejected)
} else if (this.PromiseState === 'pending') {
// 异步调用时,在扭转状态后执行函数
this.callbacks.push({onResolved: function () {setTimeout(()=>{callback(onResolved)
})
},
onRejected: function () {setTimeout(()=>{callback(onRejected)
})
}
})
}
})
}
Promise.prototype.catch = function(onRejected){return this.then(undefined,onRejected)
}