ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-19 22:02:41  阅读:146  来源: 互联网

标签:function err self PromiseStatus 修改 promise reject 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){

}

标签:function,err,self,PromiseStatus,修改,promise,reject,Promise,手写
来源: https://www.cnblogs.com/IwishIcould/p/14678801.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有