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毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

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

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    http://blog.csdn.net/sinat_33950284/article/details/50646622
    http://edu.csdn.net/course/detail/2798?ref=blog&loc=0
    微服务架构的分布式事务解决方案
    http://www.cnblogs.com/chenpi/p/5999707.html
    http://blog.csdn.net/hejingyuan6/article/details/47403299
    https://www.oschina.net/p/goshop2
    https://github.com/SuperMan42/MVP
    spring mvc
    http://www.iyaxi.com/2015-11-17/732.html
    场景测试
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/14678801.html
Copyright © 2011-2022 走看看