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){ }

手写promise完成异常处理和状态只能够修改一次的更多相关文章

  1. 手写Promise A+ 规范

    基于ES6语法手写promise A+ 规范,源码实现 class Promise { constructor(excutorCallBack) { this.status = 'pending'; ...

  2. 手写promise

    写在前面: 在目前的前端分开中,我们对于异步方法的使用越来越频繁,那么如果处理异步方法的返回结果,如果优雅的进行异步处理对于一个合格的前端开发者而言就显得尤为重要,其中在面试中被问道最多的就是对Pro ...

  3. 手写Promise看着一篇就足够了

    目录 概要 博客思路 API的特性与手写源码 构造函数 then catch Promise.resolved Promise.rejected Promise.all Promise.race 概要 ...

  4. 手写Promise中then方法返回的结果或者规律

    1. Promise中then()方法返回来的结果或者规律 我们知道 promise 的 then 方法返回来的结果值[result]是由: 它指定的回调函数的结果决定的 2.比如说下面这一段代码 l ...

  5. [转]史上最最最详细的手写Promise教程

    我们工作中免不了运用promise用来解决异步回调问题.平时用的很多库或者插件都运用了promise 例如axios.fetch等等.但是你知道promise是咋写出来的呢? 别怕-这里有本promi ...

  6. 前端面试题之手写promise

    前端面试题之Promise问题 前言 在我们日常开发中会遇到很多异步的情况,比如涉及到 网络请求(ajax,axios等),定时器这些,对于这些异步操作我们如果需要拿到他们操作后的结果,就需要使用到回 ...

  7. 手写promise解决回调地狱问题

    在介绍promise之前我们先来看一段代码: 根据案例我们可以看出,这段代码可以无限的嵌套下去,但是每嵌套一层,代码的运行就会降低,而解决回调地狱最好的办法就是new promise 一.什么是 pr ...

  8. 手写Promise简易版

    话不多说,直接上代码 通过ES5的模块化封装,向外暴露一个属性 (function(window){ const PENDING = 'pending'; const RESOLVED = 'fulf ...

  9. 手写 Promise

    在上一章节中我们了解了 Promise 的一些易错点,在这一章节中,我们会通过手写一个符合 Promise/A+ 规范的 Promise 来深入理解它,并且手写 Promise 也是一道大厂常考题,在 ...

  10. 手写Promise原理

    我的promise能实现什么? 1:解决回调地狱,实现异步 2:可以链式调用,可以嵌套调用 3:有等待态到成功态的方法,有等待态到失败态的方法 4:可以衍生出周边的方法,如Promise.resolv ...

随机推荐

  1. HTTP请求转发那些事:你可能不知道的Hop-by-hop Headers和End-to-end Headers

    摘要:不是所有的web容器都能帮助开发者屏蔽hop-by-hop headers,有些容器反而允许开发者自定义hop-by-hop headers来实现更大程度的灵活性. 本文分享自华为云社区< ...

  2. 陕西旅游集团旗下景区春节期间累计接待超 200 万人次,这背后也有火山引擎 VeDI 的身影

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 春节期间累计接待游客 200.42 万人次,同比 2022 年增长 102.47%,同比 2019 年增长 19.27%, ...

  3. Solon2 开发之IoC,九、自定义注解开发汇总

    1.定义构建能力注解,比如@Controller 注解类: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Docum ...

  4. Hyper-V CentOS Linux 硬盘扩容

    同一物理盘进行扩容(非挂载),首先在虚机内将硬盘空间扩大, Hyper-V 需要将检查点删除 查看物理卷和卷组,并将物理卷加入到卷组 #将剩余空间添加到逻辑卷 /dev/centos/root lve ...

  5. AIGC加速迭代,云栖大会视频云「媒体服务」专场与你共话云智深度融合

    2023杭州·云栖大会 倒计时5天! 阿里云视频云 5大并行Session 11场话题演讲 深度演绎云智融合的全面进化 「媒体服务」Tech专场 重磅议题剧透来袭 01 「媒体服务」Tech • 新数 ...

  6. 在Windows上D盘上安装Docker

    Reference https://www.willh.cn/articles/2022/07/13/1657676401964.html Docker默认安装在C盘: "C:\Progra ...

  7. Windows | 安装 Docker 遇到的 WSL 2 installation is incomplete 报错的解决方案

    控制面板中打开 Windows功能,在其中勾选 适用于 Linux 的 Windows 子系统 下载 WSL 更新包(非最新版本的也会报错) 更新包下载链接:https://wslstorestora ...

  8. MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】

    MPI Maelstrom POJ - 1502 实验室有很多台计算机,由于每个人计算机的性能不同,导致计算机之间发送信息的速度不同,所以花费时间不同. 消息从第一台电脑发送到第二台电脑后,这两台电脑 ...

  9. python进阶(5)--函数

    文档目录: 一.函数体二.实参与形参三.返回值四.举例:函数+while循环五.举例:列表/元组/字典传递六.模块与函数的导入 ------------------------------------ ...

  10. 每天学五分钟 Liunx 0101 | 服务篇:创建进程

    创建子进程 上一节说过创建子进程的三种方式: 1. fork 复制进程:fork 会复制当前进程的副本,产生一个新的子进程,父子进程是完全独立的两个进程,他们掌握的资源(环境变量和普通变量)是一样的. ...