码迷,mamicode.com
首页 > 其他好文 > 详细

promise实现原理代码

时间:2019-08-21 21:23:52      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:hit   rom   resolve   回调   fun   结束   bind   status   except   

//Promise实现原理



// 实例方法
// then 
// catch
// new P( 函数 ).then(functon(){}).then(function(){})
// let p = new MyPromise();
// p.resolve(); //不允许的


// 静态方法
// all 
// race

// 属性
// status :  pending / resolved / rejected
// resolve / reject

// 要求, 每个promise对象, status状态初始为pending
// 该属性不可直接修改,只能通过回调 修改
// 并且,状态一旦被修改, 不可逆.
// 执行目标函数时, 需要传参数, resolve, reject



function MyPromise(main){
    let status = "pending";  //MyPromise刚被创建的初始化状态
    let listTask = [];  //定义一个数组,用于存储.then()里函数
    let exceptionHander = null; //用于捕捉错误
    function resolve(msg){  //如果函数返回resolve()方法则调用
        if(status == "pending"){    //如果状态为pending则执行,否则不执行,程序结束
            status = "resolve";     //函数顺利执行完将promise状态改为resolve
            let next = listTask.shift();    //拿出数组中第一个
            let newp = next(msg);   
            if(newp instanceof MyPromise){ //如果拿出来函数也new MyPromise,则执行
                listTask.forEach(t=>{ 
                    newp.then(t);   //例 new MyPromise(ajaxB).then(function(){ return new MyPromise(ajaxC)}).then(ajaxD).catch(function(e){console.log(e)})
                })
            }
        }
    }
    function rejected(msg){   //如果返回rejected,执行此函数
        if(status == "pending"){//如果当前MyPromise状态为pending
            status = "rejected";    //更改状态为rejected ,抛出异常,输出方法里的msg
            if(exceptionHander){  //有catch则调用,否则报错
            }else{
                exceptionHander(msg);
            }
        }
    }
    this.then = function(task){ //讲第一个new Promise后面所有.then加入listTask数组里
        console.log(this);
        listTask.push(task);
        return this;    //返回,循环加入
    },
    this.catch = function(fn){
        exceptionHander = fn;
    }
    this.getStatus = function(){
        return status;
    }

        main(resolve,rejected.bind(this));//给第一个函数两个参,函数也需要设置两个参数接收,否则报错
} 

MyPromise.all = function(args){
    let count = 0;
    let task = null;
    function isOver(){
        count++;
        if(count == args.length) task();
    }
    args.forEach(p=>{
        p.then(isOver);
    })

    return then(fn){
        task = fn;
    }
}

测试以上

  <script src="Promise.js"></script>
    <!-- <script src="原生JS实现Promise.js"></script> -->
    <script>

        function ajaxA(resolve,reject){
            console.log("ajaxA start!");
                setTimeout(()=>{
                    console.log("ajaxA end!");
                    resolve();
                },Math.random()*2000)
        }

        function ajaxB(resolve,reject){
            console.log("ajaxB start!");
                setTimeout(()=>{
                console.log("ajaxB end!");
                resolve();
            },Math.random()*2000)
        }
        function ajaxC(resolve,reject){
            console.log("ajaxC start!");
                setTimeout(()=>{
                    console.log("ajaxC end!");
                    reject("iii");
                },Math.random()*2000)
        }

        new MyPromise(ajaxA).then(function(){
            return new MyPromise(ajaxB);
        }).then(ajaxC).catch(function(e){
            console.log(e);
        })

    </script>

 

//Promise实现原理



// 实例方法
// then
// catch
// new P( 函数 ).then(functon(){}).then(function(){})
// let p = new MyPromise();
// p.resolve(); //不允许的


// 静态方法
// all
// race

// 属性
// status : pending / resolved / rejected
// resolve / reject

// 要求, 每个promise对象, status状态初始为pending
// 该属性不可直接修改,只能通过回调 修改
// 并且,状态一旦被修改, 不可逆.
// 执行目标函数时, 需要传参数, resolve, reject



function MyPromise(main){
let status = "pending"; //MyPromise刚被创建的初始化状态
let listTask = []; //定义一个数组,用于存储.then()里函数
let exceptionHander = null; //用于捕捉错误
function resolve(msg){ //如果函数返回resolve()方法则调用
if(status == "pending"){ //如果状态为pending则执行,否则不执行,程序结束
status = "resolve"; //函数顺利执行完将promise状态改为resolve
let next = listTask.shift(); //拿出数组中第一个
let newp = next(msg);
if(newp instanceof MyPromise){ //如果拿出来函数也new MyPromise,则执行
listTask.forEach(t=>{
newp.then(t); //例 new MyPromise(ajaxB).then(function(){ return new MyPromise(ajaxC)}).then(ajaxD).catch(function(e){console.log(e)})
})
}
}
}
function rejected(msg){ //如果返回rejected,执行此函数
if(status == "pending"){//如果当前MyPromise状态为pending
status = "rejected"; //更改状态为rejected ,抛出异常,输出方法里的msg
if(exceptionHander){ //有catch则调用,否则报错
}else{
exceptionHander(msg);
}
}
}
this.then = function(task){ //讲第一个new Promise后面所有.then加入listTask数组里
console.log(this);
listTask.push(task);
return this; //返回,循环加入
},
this.catch = function(fn){
exceptionHander = fn;
}
this.getStatus = function(){
return status;
}

main(resolve,rejected.bind(this));//给第一个函数两个参,函数也需要设置两个参数接收,否则报错
}

MyPromise.all = function(args){
let count = 0;
let task = null;
function isOver(){
count++;
if(count == args.length) task();
}
args.forEach(p=>{
p.then(isOver);
})

return then(fn){
task = fn;
}
}

promise实现原理代码

标签:hit   rom   resolve   回调   fun   结束   bind   status   except   

原文地址:https://www.cnblogs.com/kongVv/p/11391184.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!