const PROMISE_PEDDING = 'pedding'
const PROMISE_RESOLVED = 'resolved'
const PROMISE_REJECTED = 'rejected'
class MyPromise {
resolveValue = null
rejectValue = null
onResolveCallBacks = []
onRejectCallBacks = []
constructor(exefn) {
this.status = PROMISE_PEDDING
const resolve = (value) => {
if (this.status === PROMISE_PEDDING) {
this.resolveValue = value
queueMicrotask(() => {
this.status = PROMISE_RESOLVED
this.onResolveCallBacks.forEach((fn) => fn())
})
}
}
const reject = (value) => {
if (this.status === PROMISE_PEDDING) {
this.rejectValue = value
queueMicrotask(() => {
this.status = PROMISE_REJECTED
this.onRejectCallBacks.forEach((fn) => fn())
})
}
}
exefn(resolve, reject)
}
then(onResolved, onRejected) {
return new MyPromise((resolve, reject) => {
if (
this.status === PROMISE_RESOLVED &&
typeof onResolved === 'function'
) {
try {
const result = onResolved(this.resolveValue)
resolve(result)
} catch (error) {
reject(error)
}
}
if (
this.status === PROMISE_REJECTED &&
typeof onRejected === 'function'
) {
try {
const result = onRejected(this.rejectValue)
resolve(result)
} catch (error) {
reject(error)
}
}
if (this.status === PROMISE_PEDDING) {
this.onResolveCallBacks.push(() => {
try {
const result = onResolved(this.resolveValue)
resolve(result)
} catch (error) {
reject(error)
}
})
this.onRejectCallBacks.push(() => {
try {
const result = onRejected(this.rejectValue)
resolve(result)
} catch (error) {
reject(error)
}
})
}
})
}
}
const promise = new MyPromise((resolve, reject) => {
console.log('111')
resolve('22222')
})
promise
.then(
(res) => {
console.log('then1', res)
return '啦啦啦啦'
},
(err) => {
console.log(err)
}
)
.then(
(res2) => {
console.log('res2', res2)
},
(err) => {
console.log('err2', err)
}
)
promise
.then(
(res) => {
console.log('then2', res)
return '哦哦哦哦'
},
(err) => {
console.log(err)
}
)
.then(
(res2) => {
console.log('then2-res2', res2)
},
(err) => {
console.log('then2-res2', err)
}
)
乞丐版Promise实现
于 2023-04-06 17:06:05 首次发布