实现简单的promise

只考虑成功时的调用,方便理解一下promise的原理
promise的例子:

1、

接下来一步步实现一个简单的promise

step1:
promise 接受一个函数作为构造函数的参数,是立即执行的,并且返回个resolve函数作为该函数的回调

function CPromise(fun){
  function resolve(){
  } fun(resolve); }

step2:

promise的then方法接受一个函数作为参数,并且该函数的参数值,来自于resolve方法中传入的参数,说明resolve运行时,实际上运行了then函数中作为参数的函数(注册该函数)

调用then方法(相当于先注册返回成功后需要执行的函数,参考观察者模式),实际上就是在promise异步返回后,将所有需要处理的回调函数放入callbacks中,当resolve触发时,逐个执行callbacks中的回调。

function CPromise(fun){
   this.callback = null;
  function resolve(data){
        this.callback(data);
  }
   this.then = function(callback){
        this.callback = callback;
   } 
    fun(resolve);
}

此时运行

step3:

说明在resolve方法被运行时,then中的函数还没有被注册(因为代码是同步的,所以直接就运行了resolve),所以加一个延迟,保证调用时一定被注册了,call用来绑定Cpromise 中的this作用域,原生promise并不需要

function CPromise(fun){
   this.callback = null;
  function resolve(data){
    setTimeout(()=>{
      this.callback(data);

    });
  }
   this.then = function(callback){
        this.callback = callback;
   } 
    fun.call(this,resolve);//绑定this作用域,this.callback时使用
}

step4:

满足多次调用then,可以设置一个数组存储then中注册的函数

function CPromise(fun){
   this.callbacks = [];
  function resolve(data){
    setTimeout(()=>{
      this.callbacks.forEach(function(fun){
         fun(data);
      });
   });
  }
   this.then = function(callback){
        this.callbacks.push(callback);
   } 
    fun.call(this,resolve);
}    

 

step5:
加入状态机制,当promise的状态还在Pending时,then中注册的事件就push到队列中,如果已经Fulfilled,那么之后注册的事件立即执行

promise的例子:

theh中的事件是在resolve运行后才注册的,说明当状态已经是Fulfilled后,所有注册的事件都是立即执行的

function CPromise(fun){
   this.callbacks = [],
        state='pending',
        value = null;
  function resolve(data){
        this.value = data;
    setTimeout(()=>{            
           this.state = 'fulfilled';  
      this.callbacks.forEach(function(fun){
                 fun(data);
          });
   });
  }
   this.then = function(callback){
        if(this.state == 'pending'){
            this.callbacks.push(callback);
        }
        callback(this.value);
   } 
    fun.call(this,resolve);
} 

function a(){
    var c = b();
    setTimeout(function(){
        console.info(1);
        c.then(function(data){
            console.info(data);
        })
        c.then(function(data){
            console.info('a'+data);
        })
    },0);
}
function b(){        
    return new CPromise(function(resolve)    {
        console.info(2);
        resolve.call(this,123);
    })
}
a();

 

 

posted @ 2019-03-04 20:41  abc1234_abc  阅读(418)  评论(0编辑  收藏  举报