手写promise原理系列五:Promise.prototype.catch方法的封装与异常穿透,promise.catch的用法
创始人
2024-06-02 22:31:26
0

在上一篇文章中手写封装了 then 方法,这一篇继续前行,可以在原有封装 then 方法的前提下封装一个 catch 方法,非常简单。

catch 方法接受一个参数,就是失败时的回调,而 then 方法接受两个参数,第二个参数为失败时的回调,那可不可以只使用 then 方法的第二个参数呢?

catch 的功能实现:

  • 接受一个参数:onRejected
  • 返回一个 promise 对象
  • 异常穿透

先来看一下 catch 的使用方式:

let p = new Promise((resolve, reject) => {reject("NO");
})
p.catch(reason => {console.log(reason);  // "NO"
})

Promise.prototype.catch 代码封装如下

Promise.prototype.catch = function(onRejected){// this就是实例对象 promisereturn this.then(undefined, onRejected);
}

上面代码 then 中第一个参数使用 undefined 占位,就像我们使用 call 以及 apply 时,无绑定 this 形式一样,例如:

fn.call(null, 1, 2, 3)
fn.apply(null, [1, 2, 3])

catch 的链式调用使用方式:

let p = new Promise((resolve, reject) => {reject("NO");
})
// 这里的第一个then方法没有传参,且后面每一个then方法只传了一个回调函数
p.then().then(value=> {console.log(value);
}).then(value=> {console.log(value);
}).catch(reason => {console.log(reason);
})

在上面代码中的第一个 then 方法中没有传递回调函数,这时候咱们封装的 then 方法肯定报错,程序无法执行,因为不传参数,相当于传递两个 undefined 值,undefined 值无法进行函数调用,因为 then 方法内部默认是传递函数作为参数的。这时候就需要在 then 方法中添加未传值时的处理,当 then 中无值或只有一个值时,我们给他一个自定义生成的函数,这样成功和错误的结果会向下传递,不至于报错而终止程序。

还得修改then方法:

Promise.prototype.then = function(onResolved, onRejected){// 若无 onResolved,则自定义一个 onResolved函数,并传递成功结果if (typeof onResolved !== "function") {onResolve = value => value;}// 若无 onRejected,则自定义一个 onRejected函数,并传递失败结果if (typeof onRejected !== "function") {onRejected = (reason) =>{throw reason; // 抛出错误,这就是异常穿透,直到遇到 try...catch...才会停止。}}return new Promise((resolve, reject) => {// ...其他代码...})
}

当 then 中第二个参数 onRejected 回调函数为 undefined 时,给他一个自定义函数,然后一直抛出错误,让错误可以一直向下传递,直到遇到try...catch...捕获错误,这种通过多层级获取抛出错误的方式就是异常穿透

下图为上面代码的图示理解,我尽力了。

在这里插入图片描述

相关内容

热门资讯

文艺汇演主持词开场白 文艺汇演主持词开场白9篇  根据活动对象的不同,需要设置不同的主持词。我们眼下的社会,活动集会越来越...
总结大会主持词   导语:春去秋回又一栽,似水流年旺年来。  2017年公司年会主持词  一.主持人开场白  男:一...
农村结婚典礼主持词 农村结婚典礼主持词  一对新人立堂前,两心相印似蜜甜,三生有幸结良缘,下面是小编分享的 农村结婚典礼...
春节联欢晚会主持词开场白   翻开精美的日历,我细数着春节将要来临。那是我们中华民族的传统节日,更是我期盼的佳节,因为只有这几...
真爱至上中英文经典台词 真爱至上中英文经典台词  1、All I want for Christmas is you.  今...
欢聚一堂舞蹈主持词 欢聚一堂舞蹈主持词  串词是在晚会、联欢会等大型联欢活动中,主持人把前后节目,把整台节目恰到好处的联...
主持词结束语 主持词结束语(通用12篇)  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。在人们越来越...
秋季小学开学典礼校长的致辞 秋季小学开学典礼校长的致辞(通用13篇)  在学习、工作、生活中,许多人都有过写致辞的经历,对致辞都...
五月的主持词开场白 五月的主持词开场白  主持人在台上表演的灵魂就表现在主持词中。在当下这个社会中,各种场合中活跃现场气...
重阳节优秀致辞 重阳节优秀致辞范文  无论是身处学校还是步入社会,大家都用到过致辞吧,在各种重大的庆典、外交、纪念活...
QQ群晚会开幕词 QQ群晚会开幕词  QQ群晚会开幕词    尊贵的各位嘉宾,群主,各位管理,群友们大家晚上好:   ...
主持谢幕词 主持谢幕词范本  篇一:主持谢幕词  愿一切荣耀、尊贵、颂赞都归给至高上帝!  都说“台上一分钟,台...
圣诞节联欢晚会主持词 圣诞节联欢晚会主持词  主持词的写作需要将主题贯穿于所有节目之中。在一步步向前发展的社会中,主持词与...
元宵节的主持词 元宵节的主持词  一般在节日的时候,都是会举行一些活动的,尤其是在元宵节这个大型的节日。下面是小编为...
初中生晨会主持词 初中生晨会主持词(通用5篇)  主持词要尽量增加文化内涵、寓教于乐,不断提高观众的文化知识和素养。现...
晨会主持词开场白   开晨会是公司职场管理的规章制度,那么公司晨会主持如何开场白好呢?以下是小编为大家搜集整理提供到的...
企业年会主持词 企业年会主持词  主持词是主持人在台上表演的灵魂之所在。在人们越来越多的参与各种活动的今天,主持词是...
企业晚会的主持词 企业晚会的主持词  借鉴诗词和散文诗是主持词的一种写作手法。在人们越来越多的参与各种活动的今天,主持...
年终总结会主持词 2021年终总结会主持词范文(精选13篇)  契合现场环境的主持词能给集会带来双倍的效果。现今社会在...
半台词爆笑 三句半台词大全爆笑  三句半是一种中国民间群众传统曲艺表演形式,下面是为带大家整理的爆笑的'三句半台...