手撕Promise (一)

1:首先初始化一个Promise构造函数

//Promise构造函数
function Promise(){}

//构造函数原型链中的then方法
Promise.prototype.then=function(){};

2:引入Promise和then的参数

//构造函数中需要传入一个函数作为参数 executor
function Promise(executor){}

//同样的,then方法里面也需要传入两个函数 onResolved,onRejected
Promise.prototype.then=function(onResolved,onRejected){};

3:调用executor

function Promise(executor){
  //在Promise里调用executor,并提供resolve,reject 函数的使用
  executor(resolve,reject);
  
}
  
Promise.prototype.then=function(onResolved,onRejected){};

4.初始化Promise的状态

function Promise(executor){
  //两个初始状态
  this.PromiseState='pending';
  this.PromiseResult=null;
  executor(resolve,reject);
  
}
  
Promise.prototype.then=function(onResolved,onRejected){};

5.定义并初步定义resolve 和 reject 函数

function Promise(executor){
  this.PromiseState='pending';
  this.PromiseResult=null;
  //保存this 以便于resolve函数和 reject函数调用
  const self=this; 
  //由于resolve 和 reject 都未定义无法使用 ,所以这里需要定义这两个函数提供使用
  function resolve(data){
   //1.修改对象的状态(promiseState)
   self.PromiseState='fulfilled';
   //2.设置对象结果值(promiseResult)
   self.PromiseResult=data;
}
  
  function reject(data){
   //1.修改对象的状态(promiseState)
   self.PromiseState='rejected';
   //2.设置对象结果值(promiseResult)
   self.PromiseResult=data;
}
  executor(resolve,reject);
} 
Promise.prototype.then=function(onResolved,onRejected){};

​

6.判断PromiseState的状态,以确保这个状态只能修改一次

function Promise(executor){
  this.PromiseState='pending';
  this.PromiseResult=null;
  const self=this; 
  function resolve(data){
   //判断状态
   if(self.PromiseState!=='pending') return;
   self.PromiseState='fulfilled';
   self.PromiseResult=data;
}
  
  function reject(data){
   //判断状态
   if(self.PromiseState!=='pending') return;
   self.PromiseState='rejected';
   self.PromiseResult=data;
}
  executor(resolve,reject);
} 
Promise.prototype.then=function(onResolved,onRejected){};

7.处理抛出错误的bug

function Promise(executor){
  this.PromiseState='pending';
  this.PromiseResult=null;
  const self=this; 
  function resolve(data){
   if(self.PromiseState!=='pending') return;
   self.PromiseState='fulfilled';
   self.PromiseResult=data;
}
  
  function reject(data){
   if(self.PromiseState!=='pending') return;
   self.PromiseState='rejected';
   self.PromiseResult=data;
} 
//没出错执行try 出错了执行reject();
  try{
  executor(resolve,reject);
  }catch(e){
   reject(e);
} 
Promise.prototype.then=function(onResolved,onRejected){};

8.完善then方法

function Promise(executor){
  this.PromiseState='pending';
  this.PromiseResult=null;
  const self=this; 
  function resolve(data){
   if(self.PromiseState!=='pending') return;
   self.PromiseState='fulfilled';
   self.PromiseResult=data;
}
  
  function reject(data){
   if(self.PromiseState!=='pending') return;
   self.PromiseState='rejected';
   self.PromiseResult=data;
} 
  try{
  executor(resolve,reject);
  }catch(e){
   reject(e);
} 
Promise.prototype.then=function(onResolved,onRejected){
  //成功了就执行onResolved函数
  if(this.PromiseState==='fulfilled') 
  onResolved(this.PromiseResult);
  //失败了就执行onRejected函数
  onRejected(this.onRejected);
};

函数执行结果:

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值