promise实现原理代码

Posted kongvv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了promise实现原理代码相关的知识,希望对你有一定的参考价值。

//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实现原理代码的主要内容,如果未能解决你的问题,请参考以下文章

Promise原理及实现

promise实现原理

Promise 原理

学习Promise实现原理(附源码)

Promise的实现

promise实现原理(面试)