手写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){

}
posted @   南风晚来晚相识  阅读(218)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2020-04-19 用webpack给js添加上版本号
点击右上角即可分享
微信分享提示