- 初始结构
- this指向
- 执行异常
- 异步
- 回调保存
console.log("promise");class myPromise { static PENDING = "待定"; static FULFILLED = "成功"; static REJECTED = "拒绝"; constructor(func) { this.status = myPromise.PENDING this.result = null this.resolveCallbacks = [] // 待定状态下保存回调函数 this.rejectCallbacks = [] try { // 修改this指向 func(this.resolve.bind(this), this.reject.bind(this)) } catch (err) { // 执行异常处理 console.log(err); this.reject(err) } } resolve(result) { // 延时函数模拟异步,执行处理后的回调 setTimeout(() => { if (this.status === myPromise.PENDING) { this.status = myPromise.FULFILLED this.result = result this.resolveCallbacks.forEach(cb => { cb(result) }) } }) } reject(result) { setTimeout(() => { if (this.status === myPromise.PENDING) { this.status = myPromise.REJECTED this.result = result this.rejectCallbacks.forEach(cb => { cb(result) }) } }) } // then方法 then(onFULFILED, onREJECTED) { return new myPromise((resolve, reject) => { onFULFILED = typeof onFULFILED === 'function' ? onFULFILED : () => { } onREJECTED = typeof onREJECTED === 'function' ? onFULFILED : () => { } if (this.status === myPromise.PENDING) { // 待定状态下,回调保存 this.resolveCallbacks.push(onFULFILED) this.rejectCallbacks.push(onREJECTED) } if (this.status === myPromise.FULFILLED) { // 模拟异步处理 setTimeout(() => { onFULFILED(this.result) }) } if (this.status === myPromise.REJECTED) { setTimeout(() => { onREJECTED(this.result) }) } }) }}console.log("1");var p = new myPromise((resolve, reject) => { console.log("2"); setTimeout(() => { // console.log(p.status); resolve("test") reject("test-reject") // console.log(p.status); console.log("4"); }) // throw new Error("出错了")})p.then( res => { console.log("then-status", p.status); console.log(res); }, res => { console.log(res.message); }).then( res => { console.log("2-then", res); }, res => { console.log(res.message); })console.log("3");