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

简介: 手写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){
}
相关文章
|
7月前
|
Web App开发 存储 移动开发
Uncaught (in promise) DOMException: The play() request was interrupted by a new load request.异常处理
Uncaught (in promise) DOMException: The play() request was interrupted by a new load request.异常处理
1053 0
|
7月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
73 1
|
7月前
|
前端开发 JavaScript
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
111 4
|
7月前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:Promise 和 Async/Await
在现代的 JavaScript 开发中,异步编程是至关重要的。本文将介绍 JavaScript 中的异步编程概念,重点讨论 Promise 和 Async/Await 这两种常见的处理异步操作的方法。通过本文的阐述,读者将能够更好地理解和应用这些技术,提高自己在 JavaScript 开发中处理异步任务的能力。
|
6月前
|
前端开发 JavaScript 开发者
JavaScript进阶-Promise与异步编程
【6月更文挑战第20天】JavaScript的Promise简化了异步操作,从ES6开始成为标准。Promise有三种状态:pending、fulfilled和rejected。基本用法涉及构造函数和`.then`处理结果,如: ```javascript new Promise((resolve, reject) =&gt; { setTimeout(resolve, 2000, &#39;成功&#39;); }).then(console.log); // 输出: 成功
101 4
|
7月前
|
JSON 前端开发 JavaScript
【JavaScript技术专栏】JavaScript异步编程:Promise、async/await解析
【4月更文挑战第30天】JavaScript中的异步编程通过Promise和async/await来解决回调地狱问题。Promise代表可能完成或拒绝的异步操作,有pending、fulfilled和rejected三种状态。它支持链式调用和Promise.all()、Promise.race()等方法。async/await是ES8引入的语法糖,允许异步代码以同步风格编写,提高可读性和可维护性。两者结合使用能更高效地处理非阻塞操作。
118 0
|
5月前
|
前端开发 JavaScript
JavaScript异步编程:Promise与async/await的深入探索
【7月更文挑战第9天】Promise和async/await是JavaScript中处理异步编程的两大利器。Promise为异步操作提供了统一的接口和链式调用的能力,而async/await则在此基础上进一步简化了异步代码的书写和阅读。掌握它们,将使我们能够更加高效地编写出清晰、健壮的异步JavaScript代码。
|
5月前
|
前端开发 JavaScript 定位技术
JavaScript 等待异步请求数据返回值后,继续执行代码 —— async await Promise的使用方法
JavaScript 等待异步请求数据返回值后,继续执行代码 —— async await Promise的使用方法
88 1
|
6月前
|
前端开发 JavaScript
Promise是JavaScript解决异步问题的构造器,代表未来的不确定值。
【6月更文挑战第27天】Promise是JavaScript解决异步问题的构造器,代表未来的不确定值。它避免了回调地狱,通过链式调用`.then()`和`.catch()`使异步流程清晰。
55 2
|
6月前
|
前端开发 JavaScript
JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。
【6月更文挑战第22天】JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。回调是基础,用于在操作完成后执行函数;Promise管理异步状态,支持链式调用;async/await提供同步代码外观,简化错误处理。每种技术在处理耗时任务时都起着关键作用。
62 3