Promise-then基础实现
实现resolve , reject同时调用时,只会执行第一个回调
then时将回调加入微任务,延迟执行,确保拿到then的成功和失败回调后执行
const PENDING = 'pending' //初始状态
const REJECTED = 'rejected' //失败状态
const FULFILLED = 'fulfilled' //成功状态
// 封装Promise
class MyPromise {
constructor(executor){
// 初始状态pending
this.state = PENDING
// 成功回调参数
this.value = undefined
// 失败回调参数
this.reason = undefined
// 成功回调
const resolve = (value)=>{
// 如果状态是pending才执行,确保状态改变一次后不在改变
if(this.state == PENDING){
this.state = FULFILLED //改变状态为成功
queueMicrotask(() => { //加入微任务,延迟执行
this.value = value //接受成功参数
this.onFulfilled(this.value) //调用then时的成功回调
})
}
}
// 拒绝回调
const reject = (value)=> {
// 如果状态是pending才执行,确保状态改变一次后不在改变
if(this.state == PENDING){
this.state = REJECTED //改变状态为失败
queueMicrotask(() => { //加入微任务,延迟执行
this.reason = value //接受错误参数
this.onRejected(this.reason) //调用then时的失败回调
})
}
}
// 执行掺入的参数
executor(resolve , reject)
}
// then方法传入成功失败状态
then (onFulfilled, onRejected){
this.onFulfilled = onFulfilled //保存成功回调
this.onRejected = onRejected //保存失败回调
}
}
// 使用自己封装的Promise
const Prom = new MyPromise((resolve, reject) => {
setTimeout(() => {
reject('失败参数') //只会执行一个
resolve('成功参数')
}, 1000);
})
Prom.then( res =>{
console.log('成功'+res);
},err => {
console.log('失败'+err); //失败失败参数
})
待解决问题
未实现then多次调用和延迟调用then时