重构 Promise 及其方法

手动写一个 Promise 的实现方法 和其方法的实现,可以更好的理解 Promise

Promise 实现

1. 实现 promise 状态只能唯一

  • test.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>myPromise</title>
    <script src="./Promise.js"></script>
</head>
<body>
<script>
    let p = new Promise((resolve, reject)=>{
        //自己封装的promise,
        //状态是可以随时切换的
        //pending--->fulfilled
        //pending--->rejected
        // setTimeout(()=>{
        //     resolve("成功了");
        // },2000)
        resolve("成功了");
        reject("error");
    })
    //then先触发
    p.then(value=>{
        console.log("===>",value);
    },reason => {
        console.log("--->",reason);
    })
    console.log(p);
</script>
</body>
</html>
  • Promise.js
function Promise(executor){
    const self = this;
    self.PromiseState = "pending";
    self.PromiseResult = undefined;
    //添加了一个数组
    self.callbacks = [];
    function resolve(value){
        if(self.PromiseState !== "pending") return;
        self.PromiseState = "fulfilled";
        self.PromiseResult = value;
        //resolve一旦被调用就触发数组
        self.callbacks.forEach(item=>{
            //item是一个{}
            item.onFulfilled(value);
        });
    }
    function reject(reason){
        if(self.PromiseState !== "pending") return;
        self.PromiseState = "rejected";
        self.PromiseResult = reason;
        self.callbacks.forEach(item=>{
            //item是一个{}
            item.onRejected(reason);
        });
    }
    try{
        executor(resolve,reject);
    }catch(e){
        reject(e);
    }
}
Promise.constructor = Promise;
Promise.prototype.then = function(onFulfilled,onRejected){
    if(this.PromiseState === "fulfilled"){
        onFulfilled(this.PromiseResult);
    }
    if(this.PromiseState === "rejected"){
        onRejected(this.PromiseResult);
    }
    //如果PromiseState=pending,在数组当中添加一个对象
    if(this.PromiseState === "pending"){
        this.callbacks.push({
            onFulfilled,
            onRejected
        })
    }
}

方法实现

利用自己的思路和方法,使用原型重新写 Promise 的方法,可以更好的理解,并可以按照自己思路进行更改或者添加功能

重构 then()resolve()reject()all()race()

test.html 为测试使用,可以自己更改测试内容

  • test.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./Promise.js"></script>
</head>
<body>
<script>
    let p1 = new Promise((resolve, reject)=>{
        setTimeout(function(){
            resolve(123);
        });
    })
    let p2 = Promise.resolve(321);
    let p3 = Promise.reject("000");
    //谁先运行完,就执行谁的结果
    let p = Promise.race([p1,p2,p3]);
    console.log(p);
</script>
</body>
</html>
  • Promise.js
function Promise(executor){
    const self = this;
    /*
    * executor = (resolve, reject)=>{
        resolve('ok');
    }
    *
    * */
    //属性
    self.PromiseState = 'pending';
    self.PromiseResult = undefined;
    //添加数组
    self.callbacks = [];
    //是不是当前对象的方法
    function resolve(value){
        if(self.PromiseState !== "pending") return;
        self.PromiseState = "fulfilled";
        self.PromiseResult = value;
        setTimeout(()=>{
            self.callbacks.forEach(item=>{
                item.onFulfilled(value);
            });
        })

    }
    function reject(reason){
        if(self.PromiseState !== "pending") return;
        self.PromiseState = "rejected";
        self.PromiseResult = reason;
        setTimeout(()=> {
            self.callbacks.forEach(item => {
                item.OnRejected(reason);
            });
        })
    }
    try{
        executor(resolve,reject);
    }catch (e){
        reject(e);
        setTimeout(()=>{
            console.error("Uncaught (in promise)",e);
        })
    }
}

/******************then()*********************************/

Promise.prototype.then = function(onFulfilled,OnRejected){
    return new Promise((resolve,reject)=>{
        //判断onFulfilled,OnRejected的默认值
        if(typeof onFulfilled !== 'function'){
            //不是函数默认改变为函数
            onFulfilled = value => value;
            //function(value) {return value}
        }
        if(typeof OnRejected !== 'function'){
            OnRejected = reason => {throw reason};
        }
        let callback = type => {
            //undefined(this.PromiseResult);
            let rs = type(this.PromiseResult);
            if(rs instanceof Promise){
                rs.then(v=>{
                    resolve(v);
                },r=>{
                    reject(r);
                })
            }else{
                //undefined ok
                resolve(rs);
            }
        }
        if(this.PromiseState === "fulfilled"){
            setTimeout(()=>{
                callback(onFulfilled);
            });
        }
        if(this.PromiseState === "rejected"){
            setTimeout(()=> {
                callback(OnRejected);
            });
        }
        if(this.PromiseState === "pending"){
            this.callbacks.push({
                onFulfilled:()=>{
                    callback(onFulfilled);
                },
                OnRejected:()=>{
                    callback(OnRejected);
                }
            })
        }
    })
}

/******************catch()*********************************/
//catch只处理一种类型的结果,reject
Promise.prototype.catch = function(OnRejected){
    return this.then(undefined,OnRejected);
}
/******************resolve()*********************************/
//写在函数对象下面
Promise.resolve = function(value){
    return new Promise((resolve,reject)=>{
        if(value instanceof Promise){
            value.then(resolve,reject);
        }else{
            resolve(value);
        }
    })
}
/******************reject()*********************************/
Promise.reject = function(reason){
    return new Promise((resolve,reject)=>{
        reject(reason);
    })
}
/******************all()*********************************/
Promise.all = function(promiseArray){
    return new Promise((resolve,reject)=>{
        let res_data = [];
        promiseArray.forEach((item,index)=>{
            item.then(value=>{
                //0:p1    1:p2     2:p3
                res_data[index] = value;
                //resolve运行了几次  3
                //promiseArray.length=3
                if(promiseArray.length===(index+1)){
                    resolve(res_data);
                }
            },reason=>{
                reject(reason);
            });
        })

    });
}
/******************race()*********************************/
Promise.race = function(promiseArray){
    //new Promise --> pending
    //Promise --> fulfilled
    //Promise --> 白跑一遍
    return new Promise((resolve,reject)=>{
        let res_data = [];
        promiseArray.forEach((item,index)=>{
            item.then(value=>{
               resolve(value);
            },reason=>{
                reject(reason);
            });
        })
    })
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值