手写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...捕获错误,这种通过多层级获取抛出错误的方式就是异常穿透

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

在这里插入图片描述

相关内容

热门资讯

将进酒 李白拼音版 将进酒 李白拼音版  qiāng jìn jiǔ  将 进 酒  jūn bú jiàn huáng...
三字经全文句句赏析 三字经全文句句赏析  rén zhī chū xìng běn shàn xìng xiāng jì...
《陋室铭》作者 《陋室铭》作者  刘禹锡(772-842),字梦得,汉族,中国唐朝彭城(今徐州)人,祖籍洛阳,唐朝文...
同儿辈赋未开海棠原文 同儿辈赋未开海棠原文  同儿辈赋未开海棠原文:  元好问  原文:  枝间新绿一重重,小蕾深藏数点红...
王之涣《登黄鹤楼》全文赏析 王之涣《登黄鹤楼》全文赏析  《登鹳雀楼》是唐代诗人王之涣(一作朱斌诗)创作的一首诗。人们对于王之涣...
诗经名篇 诗经名篇  《诗经》内容丰富,反映了劳动与爱情、战争与徭役、压迫与反抗、风俗与婚姻、祭祖与宴会,甚至...
岳阳楼记原文及翻译讲解 岳阳楼记原文及翻译讲解  原文  庆历四年春,滕子京谪(zhé)守巴陵郡。越明年,政通人和,百废具兴...
劝学诗/偶成原文、注释及赏析 劝学诗/偶成原文、注释及赏析  赏析,是一个汉语词汇,意思是欣赏并分析(诗文等),通过鉴赏与分析得出...
带拼音的《三字经》全文 带拼音的《三字经》全文  这篇文章适合刚学习拼音的小朋友们,带拼音的《三字经》全文,不仅能学习国学《...
复旦大学教授钱文忠谈《三字经... 复旦大学教授钱文忠谈《三字经》的现代意义  《三字经》是我国古代的儿童识字课本,是中国传统 的儿童启...
恨赋原文及译文 恨赋原文及译文  《恨赋》,南朝梁文学家江淹作。《恨赋》是六朝抒情骈赋中的名篇。全赋排章选句、哀恨绵...
烛之武退秦师原文以及翻译 烛之武退秦师原文以及翻译  《烛之武退秦师》载于《左传·僖公三十年》,题目为后人所加。内容讲述公元前...
诗人苏轼是哪一个朝代的 诗人苏轼是哪一个朝代的  诗人苏轼是我国北宋著名文学家、书法家、画家。诗人苏轼是哪一个朝代的,我们来...
表达思乡情感的诗词 表达思乡情感的诗词集锦  思乡的情感是每个人内心最深的感情,我们没啊抹去对家乡的思念,家乡同时也是我...
中秋对联 中秋对联大全  中秋节这样的明月晚上,古时候的才子佳人没有中秋晚会,也没有微信朋友圈,他们在这样的....
《三字经》读后感500字 《三字经》读后感范文500字  【第1篇】  “小宇,帮我倒杯水。”“才不要呢,我要看电视!”我不高...
骆驼祥子读后感1000字 骆驼祥子读后感1000字4篇  当阅读了一本名著后,大家一定对生活有了新的感悟和看法,让我们好好写份...
三字经拼音版 全文 三字经拼音版 全文  三字经是我们中华悠久的历史文化,是中华的瑰宝。三字经rén zh...
《离骚》全文对照翻译 入党誓词全文推荐度:安全文章推荐度:合同法全文推荐度:交通安全文章推荐度:诗朗诵《党旗颂》全文推荐度...
摩诘画原文 摩诘画原文  原文:  《摩诘画》  作者:黄庭坚  丹青王右辖,诗句妙九州。  物外常独往,人间无...