class MyPromise {
state = 'pending'
value = undefined
reason = undefined
resolveCallbacks = []
rejectCallbacks = []
constructor(fn) {
const resolveHandler = (value) => {
if(this.state === 'pending') {
this.state = 'fulfilled'
this.value = value
this.resolveCallbacks.forEach(fn => fn(this.value))
}
}
const rejectHandler = (reason) => {
if(this.state === 'pending') {
this.state = 'rejected'
this.reason = reason
this.rejectCallbacks.forEach(fn => fn(this.value))
}
}
try {
fn(resolveHandler, rejectHandler)
} catch (error) {
rejectHandler(error)
}
}
then(fn1, fn2) {
fn1 = typeof fn1 === 'function' ? fn1 : (v) => v
fn2 = typeof fn2 === 'function' ? fn2 : (e) => e
if(this.state === 'pending') {
const p1 = new MyPromise((resolve, reject) => {
this.resolveCallbacks.push(() => {
try {
const newValue = fn1(this.value)
resolve(newValue)
} catch (error) {
reject(error)
}
})
this.rejectCallbacks.push(() => {
try {
const newReason = fn2(this.reason)
resolve(newReason)
} catch (error) {
reject(error)
}
})
})
return p1
}
if(this.state === 'fulfilled') {
const p1 = new MyPromise((resolve, reject) => {
try {
const newValue = fn1(this.value)
resolve(newValue)
} catch (error) {
reject(error)
}
})
return p1
}
if(this.state === 'rejected') {
const p1 = new MyPromise((resolve, reject) => {
try {
const newReason = fn2(this.reason)
resolve(newReason)
} catch (error) {
reject(error)
}
})
return p1
}
}
catch(fn) {
return this.then(null, fn)
}
}
//测试
const p1 = new MyPromise((resolve, reject) => {
resolve(100)
})
p1.then(data => {
console.log(data)
return data + 1
})
实现一个简易的promise
最新推荐文章于 2024-06-12 11:59:04 发布