class Promise2 {
#status = 'pending'
constructor(fn){
this.q = []
const resolve =(data)=>{
this.#status = 'fulfilled'
const f1f2 = this.q.shift()
if(!f1f2 || !f1f2[0]) return
const x = f1f2[0].call(undefined, data)
if(x instanceof Promise2){
x.then((data)=>{
resolve(data)
}, (reason)=>{
reject(reason)
})
}else{
resolve(x)
}
}
const reject =(reason)=>{
this.#status = 'rejected'
const f1f2 = this.q.shift()
if(!f1f2 || !f1f2[1]) return
const x = f1f2[1].call(undefined, reason)
if(x instanceof Promise2){
x.then((data)=>{
resolve(data)
}, (reason)=>{
reject(reason)
})
}else{
resolve(x)
}
}
fn.call(undefined, resolve, reject)
}
then(f1, f2){
this.q.push([f1,f2])
}
}
// 用法
// const p = new Promise2((resolve, reject)=>{
// // 成功
// resolve(data)
// // 失败
// reject(reason)
// })
// p.then(f1, f2).then(f3, f4)
// p.then(f1, undefined).then(undefined, f4)
const p = new Promise2(function(resolve, reject){
setTimeout(()=>{
// resolve('hi')
reject('hello')
},3000)
})
p.then((data)=>{console.log(data)}, (reason)=>{console.error(reason)})
then的链式调用没有实现