极简实现系列——超低配版Promise

极简实现系列 是用最简单的代码实现一些常见的方法,目的是为了帮助理解原理,所以并没有考虑太多限制条件


先看下Promise的简单用法:

    const p = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve()
        }, 1000)
    })
    p.then(res => {
        console.log('过了1秒')
    })

我们来简单分析一下流程:

  1. Promise构造方法传入一个函数executor,在new Promise的时候就执行
  2. executor内部的异步任务放入队列,等待执行
  3. then方法执行后,收集成功/失败任务,放入成功/失败队列
  4. executor异步任务被执行,触发resolve/reject,从成功/失败队列取出任务执行

根据这些,就可以大致的写出一个promise的形状了 :

    class myPromise{
        // 传入一个executor函数
        constructor(executor) {
            this.resolveArr = [] // 成功队列
            this.rejectArr = [] // 失败队列

            let resolve = (val) => {
                // 从成功队列里依次取出回调
                while(this.resolveArr.length) {
                   let cb = this.resolveArr.shift()
                   cb(val)
                }
            }

            // reject 同理
            let reject = (val) => {
                // 从成功队列里依次取出回调
                while(this.resolveArr.length) {
                   let cb = this.rejectArr.shift()
                   cb(val)
                }
            }

            // 最后执行executor
            executor(resolve, reject)
        }

        // then方法接受成功和失败回调,并push进相应的队列
        then(resolve, reject) {
            this.resolveArr.push(resolve)
        }
    }

我们来测试一下

    const p2 = new myPromise((resolve, reject) => {
        setTimeout(() => {
            resolve()
        }, 1000)
    })
    p2.then(res => {
        console.log('过了1秒')
    })

1秒后【过了1秒】成功打印出来了

以上就是一个超低配版的Promise了,是不是挺简单的。当然要完整的实现Promise的功能还要考虑非常多的情况,要遵从ES6的Promise A+规范等,有兴趣的同学自行去找其他资料啦,我的水平有限,只能写到这了~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值