let successQueue = [];
let failQueue = [];
class MyPromise {
#state = 'pending';
#result;
constructor(fn) {
const resolve = (result) => {
if (this.#state !== 'pending') return
this.#result = result
this.#state = 'fulfilled'
while (successQueue.length) successQueue.shift()(result)
}
const reject = (result) => {
if (this.#state !== 'pending') return
this.#result = result
this.#state = 'rejected'
while (failQueue.length) failQueue.shift()(result)
}
try {
fn(resolve, reject)
} catch (e) {
reject(e)
}
}
then(successCallback, failCallback) {
const p = new MyPromise((res, rej) => {
if (this.#state === 'pending') {
successQueue.push(successCallback)
failQueue.push(failCallback)
}
if (this.#state === 'fulfilled') {
const result = successCallback(this.#result)
if (result instanceof MyPromise) {
result.then(res, rej)
} else {
res(result)
}
}
if (this.#state === 'rejected') rej(failCallback(this.#result))
})
return p
}
}