手写promise完成异常处理和状态只能够修改一次

8.处理 Promise 抛出的异常

<script src="./Promise.js"></script>
<script type="text/javascript">
    let p = new Promise((resolve, reject) => {
        throw 'error';
    })
    p.then(res => {
        console.log(res)
    }, err => {

    })
    console.log(p)
</script>
function Promise(executor){
   const self=this;
   function resolve(data){
     self.PromiseStatus='resolved';
     self.PromiseValue=data;
   }

   // 同样声明成为一个函数;修改状态
   function reject(err){
      self.PromiseStatus='rejected';
      self.PromiseValue=err;
   }
   //给Promise添加一个属性pending;
   this.PromiseStatus ='pending' ;
   this.PromiseValue =null;

   executor(resolve,reject);//这个放在后面;它回去调用resolve和reject函数
}
Promise.prototype.then=function(onResolve,onReject){

}
当我们抛出一个异常后,我们发现代码报错了;
因为你没有对异常进行任何的处理哈
那么如何对异常进行处理呢
可以使用try catch对抛出的异常进行处理哈

9 使用 try catch 对 Promise 异常进行处理

我们思考第一个问题;
如果我们要加上   try catch;
那么应该加在哪里呢???
function Promise(executor){
    const self=this;
    function resolve(data){
        self.PromiseStatus='resolved';
        self.PromiseValue=data;
    }
    // 同样声明成为一个函数;修改状态
    function reject(err){
        self.PromiseStatus='rejected';
        self.PromiseValue=err;
    }
    // 给Promise添加一个属性pending;
    this.PromiseStatus ='pending' ;
    this.PromiseValue =null;

    // new add对异常进行处理;使用try catch
    try{
      executor(resolve,reject);
    }catch(err){
      //这个会去接受throw 'error'抛出来的错误
      // 并且去改变Promise的状态和修改他的值
      reject(err);
    }
}
Promise.prototype.then=function(onResolve,onReject){

}

10 出现 Promise 对象状态修改了多次

<script src="./Promise.js"></script>
<script type="text/javascript">
    let p = new Promise((resolve, reject) => {
        resolve('ok')
        reject('err');
    })
    p.then(res => {
        console.log(res)
    }, err => {

    })
    //我们发现Promise对象修改了多次;这是不可以的;
    console.log(p);//Promise {PromiseStatus: "rejected", PromiseValue: "err"}
</script>
function Promise(executor){
    const self=this;
    function resolve(data){
        self.PromiseStatus='resolved';
        self.PromiseValue=data;
    }
    // 同样声明成为一个函数;修改状态
    function reject(err){
        self.PromiseStatus='rejected';
        self.PromiseValue=err;
    }
    // 给Promise添加一个属性pending;
    this.PromiseStatus ='pending' ;
    this.PromiseValue =null;

    // 对异常进行处理;使用try catch
    try{
        executor(resolve,reject);
    }catch(err){
        //这个会去接受throw 'error'抛出来的错误
        // 并且去改变Promise的状态和修改他的值
        reject(err);
    }
}
Promise.prototype.then=function(onResolve,onReject){

}
我们发现它先将状态改为成功;然后又将状态改为失败;
这样明显是要不得哈;
所以我们要处理 Promise对象状态只能够修改一次
我们应该在resolve和reject这两个函数中去判断状态是否发生改变
注意this的指向

11.解决 Promise 对象状态只能够修改一次

function Promise(executor){
    const self=this;
    function resolve(data){
        // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);注意this的指向
        if( self.PromiseStatus!=='pending') return
        self.PromiseStatus='resolved';
        self.PromiseValue=data;
    }
    // 同样声明成为一个函数;修改状态
    function reject(err){
        // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);注意this的指向
        if( self.PromiseStatus!=='pending') return
        self.PromiseStatus='rejected';
        self.PromiseValue=err;
    }
    this.PromiseStatus ='pending' ;
    this.PromiseValue =null;

    // 对异常进行处理;使用try catch
    try{
        executor(resolve,reject);
    }catch(err){
        reject(err);
    }
}
Promise.prototype.then=function(onResolve,onReject){

}
上一篇:promise和async/await区别


下一篇:Promise.all()方方详解