function Promise(executor) {
let self = this
self.status = 'pending'
self.value = undefined
self.reason = undefined
self.resolveFns = []
self.rejectFns = []
function resolve(v) {
if (self.status === 'pending') {
self.status = 'resolved'
self.value = v
self.resolveFns.forEach(fn=>fn())
}
}
function reject(v) {
if (self.status === 'pending') {
self.status = 'rejected'
self.reason = v
self.rejectFns.forEach(fn=>fn())
}
}
executor(resolve, reject)
}
Promise.prototype.then = function(resolveCall, rejectCall){
let self = this
if (this.status === 'resolved') {
resolveCall(this.value)
}
if (this.status === 'rejected') {
rejectCall(this.reason)
}
if(this.status ==='pending'){
console.log('then pending')
this.resolveFns.push(function(){
resolveCall(self.value)
})
this.rejectFns.push(function(){
rejectCall(self.reason)
})
}
}
var promise = new Promise((resolve, reject) => {
setTimeout(function(){
resolve('ok')
reject('err')
},0)
})
promise.then((value) => {
console.log('value',value)
}, (err) => {
console.log('err',err)
})