实现一个简易的promise(未处理链式调用版)

promsie/A+规范笔记

1.promise是一个实例, 可理解为let promise=Promise(executor) 其中executor可以看做是一个执行,当new一个promise的时候就自动执行executor的内容。

2.执行器函数包含两个参数,一个叫做reject,一个叫做resolve

3.一个promise里面包含三个状态,pending、fulfilled、rejected,状态fulfilled和rejected一旦进入就不可改变

4.在then里面也包含两个参数,两个参数都是函数并且不可被实例化,也不能有this的指向。

5.当调用成功时,在resolve里面改变状态,失败同理。

6.处理异步的调用,采用发布订阅者模式,因为状态未改变,所以需要在then里面增加处理PENDING状态的方法,将所有成功和失败的回调都分别存进数组里面。发布的时候是异步的方法被调用时发布,直接在resolve和reject里面进行发布,同时里面有对value和reson的赋值,因此发布的函数直接执行会采用这个函数里面的值进行执行。

以下是简单的promise实现的源码(未处理链式调用)

let PENDING='PENDING',
    FULFILLED='FULFILLED',
    REJECTED='REJECTED'

class Mypromise{
    constructor(executor){
        this.status=PENDING;//初始化状态
        this.value=undefined;//初始化value
        this.reson=undefined;//初始化reson
        this.allFulfilledCallbacks=[] //用来保存成功回调
        this.allRejectCallbacks=[] //用来保存失败的回调
        //成功的回调
        const resolve=(value)=>{
            if(this.status===PENDING){
                this.status=FULFILLED//将状态改变
                this.value=value
                //发布过程
                this.allFulfilledCallbacks.forEach(func=>func())
            }

        }
        //失败的回调
        const reject=(reson)=>{
            if(this.status===PENDING){
                this.status=REJECTED//将状态改变
                this.reson=reson
                this.allRejectCallbacks.forEach(func=>func())
            }
        }
        //异常捕获,并且改变状态,实现异常走reject
        try{
            executor(resolve,reject)

        }
        catch(err){
            this.status=REJECTED
            this.reson=err
        }

    }
    then(onFulfilled,onRejected){
        if(this.status===FULFILLED){
            onFulfilled(this.value)
        }
        if(this.status===REJECTED){
            onRejected(this.reson)
        }
        //处理异步的情况
        if(this.status=PENDING){
            //采用发布订阅者模式
            //订阅过程
            this.allFulfilledCallbacks.push(()=>{
                onFulfilled(this.value)
            })
            this.allRejectCallbacks.push(()=>{
                onRejected(this.reson)
            })
        }

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值