const PENDING = 'pending'
const FULFILLED = 'fulfilled'
const REJECTED = 'rejected'
class MyPromise {
#state = 'pending'
#result = undefined
#handlers = []
constructor(executor) {
const resolve = (data) => {
this.#changeState(FULFILLED, data)
}
const reject = (reason) => {
this.#changeState(REJECTED, reason)
}
try {
executor(resolve, reject)
} catch (err) {
reject(err)
}
}
#changeState(state, result) {
if (this.#state !== PENDING) return
this.#state = state
this.#result = result
this.#run()
// console.log(this.#state, this.#result);
}
#run() {
if (this.#state === PENDING) return
while (this.#handlers.length) {
const { onFulifilled, onRejected, resolve, reject } = this.#handlers.shift()
if (this.#state === FULFILLED) {
if (typeof onFulifilled === 'function') {
onFulifilled(this.#result)
}
} else {
if (typeof onRejected === 'function') {
onRejected(this.#result)
}
}
}
}
then(onFulifilled, onRejected) {
return new MyPromise((resolve, reject) => {
this.#handlers.push({
onFulifilled,
onRejected,
reject,
resolve
})
this.#run()
})
}
}
const p = new MyPromise((res, rej) => {
// throw 123
// res(1233333)
rej(1234444)
// setTimeout(() => {
// throw 123
// }, 0)
// setTimeout(() => {
// rej(1)
// }, 0)
})
p.then((res) => {
console.log('完成', res);
}, (err) => {
console.log('失败', err);
})
完成了promise的构造函数,以及then方法的创建