zoukankan      html  css  js  c++  java
  • 手写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){
    
    }
    
    作者:明月人倚楼
    出处:https://www.cnblogs.com/IwishIcould/

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

    万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    FindWindowEx
    c# 基础知识
    propertychange 属性说明
    Python3-2020-测试开发-22- 异常
    Python3-2020-测试开发-21- 面向对象之封装,继承,多态
    Python3-2020-测试开发-20- Python中装饰器@property
    Python3-2020-测试开发-19- Python中私有属性和私有方法
    Python3-2020-测试开发-18- Python中方法没有重载
    Python3-2020-测试开发-17- 类编程
    Python3-2020-测试开发-16- 嵌套函数(内部函数 )&nonlacal声明外部函数的局部变量&LEGB规则
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/14678801.html
Copyright © 2011-2022 走看看