(进阶)手写Promise-then方法(实现1)

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时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值