【手撕原理】面试官:来吧,手写一个简单版的 Promise

重新实现Promise.js

class myPromise{
    constructor(exc){
      //不能相信用户的输入,所以这里要做参数效验
        if(typeof exc !== 'function'){
            throw new TypeError('this is not a function!')
        }
        this.initValue();
        this.initBind();
        exc(this.resolve,this.reject);
    }
    //进行代码的优化&初始化
    initValue(){
    	//记录状态和值的改变
        //初始化值
        this.state = 'pending';  //初始状态
        this.value = null;  //终值
        this.reason = null; //据因
    }
    //绑定 this
    initBind(){
        this.resolve = this.resolve.bind(this);
        this.reject = this.reject.bind(this);
    }
     //成功后的一系列操作(状态的改变,成功回调的执行)
    resolve(value){
        if(this.state === 'pending'){
            this.state = 'resolve'; //状态进行改变
            this.value = value; //执行成功的回调,把终值进行赋值
        }
    }
    reject(reason){
    //失败后的一系列操作(状态的改变,失败回调的执行)
        if(this.state === 'pending'){
            this.state = 'reject'; //状态进行改变
            this.reason = reason; //执行成功的回调,把据因进行赋值
        }
    }
    then(resolve,reject){
    //  参数效验
        if(typeof resolve !== 'function'){
            resolve = function(value){
                return value;
            }
        }
        if(typeof reject !== 'function'){
            reject = function(reason){
                throw reason;
            }
        }
        if(this.state === 'resolve'){
            resolve(this.value);
        }
        if(this.state === 'reject'){
            reject(this.reason);
        }
    }
}
module.exports = myPromise;

test.js

const myPromise = require('./重新实现Promise')

new myPromise((resolve,reject)=>{
    console.log('it is good');
    resolve(1);
}).then(value=>{
    console.log('value',value);
},reason=>{
    console.log('reason',reason);
})
学如逆水行舟,不进则退
一百个Chocolate CSDN认证博客专家 CSDN博客专家 Vue爱好者 博客之星
不是只会写业务代码的前端开发攻城狮!博客网站:yangchaoyi.vip做限量版的自己,就这样安静地努力。一个还在苦学前端的小小Chocolate,我的博客主要分享前端、算法、大学课程笔记、平常遇到的bug、心得感悟体会,感谢您的访问,若喜欢可以关注一下~每一个清晨,记得鼓励自己。没有奇迹,只有你努力的轨迹;没有运气,只有你坚持的勇气!每一份坚持都是成功的累积,只要相信自己,总会遇到惊喜!座右铭:学如逆水行舟,不进则退!
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值