手写Promise

141 阅读2分钟

周末最后一天总感觉事件不够用,今天下午抽空打了会球(●'◡'●).晚上回来给对promise理解不够深入的兄弟们写写promise,许多刚入门前端的小伙子们对promise不太理解,只知道调用接口用到promise.晚上带你们一步一步写粗来promise.如果你能跟我一起写出来,就真正理解promise了.话不多说了码码码!

``` function myPomise() {
        this.status = "pending" //promise不是三个状态吗,定义下
        this.success = null; //成功时候的内容
        this.error = null; // 失败时候的内容
        let that = this; // 方便后面使用
        this.fuback=[];
        this.rejback=[];
        
        
        function resolve(val) {
        //这是成功时候执行的函数
            that.sucess=val
            that.status="fufilled"
            //刚才订阅了该发布了 失败也一样
            that.fuback.froEach(item=>item())//之前传递的不是方法吗  在这里依次调用
        }
        function reject(val) {
        //这是失败时候执行的函数
            that.error=val;
            that.status="rejected"
            that.rejback.forEach(item=>item())//同上
        }
        try{
             executor(resolve,reject);//promise 立即执行就靠他了
        }catch(err){
            reject(err)
            }
    }
    
    //你不是能then吗来给他挂上  定义这个then方法
    myPromise.prototype.then=function(onfufilled,onrejected) {
        let that =this
        if(that.status === "fufilled") {
            onfufiied(that.success)
        }
        if(that.status === "rejected") {
            onrejected(that.error)
        }
        if(that.status === "pending") {
            //这里为了解决这个这个这个那什么来着  对对对异步的时候上面两个能在异步执行的时候执行
            that.fuback.push(function(){ onfufilled(that.success)});
            that.rejback.push(function(){ onrejected(that.error)}); //相当于什么呢就相当于我在这订阅了,在执行成功或者失败的时候发不出来 去上面找     
        }
    
    } 
## 打球有点累了,给大家写了一个简易版的promise为什么是简易的大家可以调用试一下,这个promise不能链式调用,就是说不能.then.then.then晓得了吧也不能catch,床上写的没鼠标我给你们标注完了洗漱明天上班了,刚学会写这个就可以至于.then私聊我吧哈哈哈哈哈哈哈哈嗝....我当初学这个可是看了不少视频,能看懂我这个你就牛牛牛牛年牛牛牛牛牛了.我去给你们标序号 就是写promise的思路.不标了表不明白


第一步 能new就要创建方法 然后成功失败标志都定义出来,你要立即执行就要用exector这个玩意儿
2:你要能.then  就要在他的原型上加上这个方法
3:失败 成功的方法补全代码   先不写发布订阅
4:这时候你只要写简单的同步代码就可以实现了
5:当你new promise 里面用到了比如说定时器的时候,因为方法是同步执行的 定时器走完,走不到成功和失败的方法,这时候你就要加上订阅发布的那个东西了,就是一个思想,就叫订阅发布吧.
6:想学完整你私聊我昂可以去看看大厂老员工或者其他大神的代码,不过这个promise看不懂最好去听视频,耐心一点一点听,学习是一个过程急不得.


Goodnight!