问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何优雅处理 async await 错误——解读小而美的 awaitjs 库

发布网友 发布时间:2022-10-03 10:54

我来回答

1个回答

热心网友 时间:2023-10-10 04:51

最近有在读一些比较优秀的npm包的代码,起因是感觉自己现在写的代码还是不够规范,不够简洁。

可是我又不知道到底什么样的代码才算是比较的代码,在进行一番思考过后我认为还是要站在巨人的肩膀上。

通过阅读优秀的源码并从中学习如何写出让人觉得赏心悦目的代码最后再写文进行章总结对整个学习的过程进行一个梳理同时分享给其他人。

为什么要在开头写这么多呢?因为我需要为自己坚持下去找一个理由。这样我才能乘风破浪,一往无前。

话不多说,开始总结。

在正式介绍await-to-js这个库之前,让我们先简单的回顾一下有关于在JavaScript这门语言中,异步编程的进化之路。在Promise没出现之前,异步编程一直是困扰着前端工程师的一个大难题,当时的前辈可能会经常看到下面这种代码。

这种同时在纵向和横向延伸的回调中嵌套着回调的代码又被称为回调地狱 。可见这玩意让人多么恶心,具体来说有以下这几个缺点

Promise是一种优雅 的异步编程解决方案。从语法上来将,它是一个对象, 代表着一个异步操作最终完成或失败,从语意上来讲,它是承诺,承诺过一段时间给你一个结果。

由于它的原型存在then,catch,finally会返回一个新的promise所以可以允许我们链式调用,解决了传统的回调地狱的问题。

由于它本身存在all方法,所以可以支持多个并发请求,获取并发请求中数据。

有了Promise后,上面的代码可以被写成下面这样。

相比较于上面的回调地狱,使用Promise可以帮助我们让代码只在纵向发展,并且提供了处理错误的回调。显然优雅了很多。不过就算Promise已经这么优秀了,可是依然存在两个每种不足的地方

async 函数是 Generator 函数的语法糖。使用 关键字 async 来表示,在函数内部使用 await 来表示异步。相较于 Generator , async 函数的改进在于下面四点:

此处总结参考自:理解async/await[1]

有了async/await,上面的代码可以被改写成下面这样

同时我们可以对每一次异步操作进行错误处理

这样一来上面Promise存在的两个每种不足的地方是不是就被优化了呢?所以说async/await是JS中异步编写的最后解决方案我个人觉得一点问题没有,但是我不知道你看上面的代码,每一次异步操作都要用try/catch进行错误处理是不是感觉不够方便不够智能呢?

作者是这样介绍这个库的

中文翻译过来就是

这里做个简单的对比,之前我们在异步操作中处理错误的方法是这样的

而用了await-to-js之后,我们可以这样的处理错误

是不是简洁多了呢?

作者究竟用了什么黑魔法?

你可能不信,源码只有仅仅15行。

上面这里是TS版的源码,但是考虑到有些同学可能还没接触过TS,我着重分析一下下面这版JS版的源码。

这里我们先抛开errorExt这个自定义的错误文本,核心代码是这样的

可以看出,其代码的逻辑用中文解释是这样的

经过上面的分析我们可以认定,世界上没有什么黑魔法,没有你做不到,只有你想不到。

这里我们再来看函数to的第二个参数errorExt不难发现,这玩意其实就是拿来用户自定义错误信息的,通过 Object.assign 将正常返回的error和用户自定义和合并到一个对象里面供用户自己选择。

源码不可怕,可怕的是自己的面对未知的恐惧感。

敢于面对,敢于尝试,才能更上一层楼。

继续加油,少年。


[1]

https://segmentfault.com/a/1190000010244279:https://link.juejin.cn?target=https%3A%2F%2Fsegmentfault.com%2Fa%2F1190000010244279

[2]

How to write async await without try-catch blocks in Javascript:https://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript/



声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
sometimesome timesometimessome times的区别 瓜地的午餐怎么造句 夏季宝宝不吃饭应该怎么办 狼人杀里面的白狼王模式怎么玩? 狼人杀白狼王和骑士:操作至上的高效玩法指南 狼人杀手游白狼王怎么玩 详细玩法攻略 狼人杀 狼人杀的白狼王怎么玩? 国产轮毂品牌有哪些 国产轮毂品牌哪个品牌好 国内轮毂有哪些品牌 岗位和职务怎么填 怎么加好友 怎么添加 添加微信好友的步骤 彩视设置成私密后转发给一个人,他再转发他人能看到吗? 电磁炉能启动但不加热 是什么问题呢 如何在Word文档中图片上插入编号 纸兔子的折法 你想学吗 手工小兔子的做法 如何用纸折可爱的小白兔 华硕台式机,开机时显示“没有检测到开机设备,系统将进入Bios设置程序”,怎么解决? 我家的遥控器是万能的,但电视机是杂牌的,最近遥不了了,修理师傅说是锁了,可是我怎么也开不了,怎么办 华硕台式电脑 开机回显示没有检测到开机设备系统会进入BIOS设置程序 怎么办 一台杂牌机,图像声音都正常,但是遥控控制不了,电视机本身面板上的按键都可以按,是什么毛病? 手机遥控器怎么开不了电视机? 折纸教程 怎样折一只小兔子 word中插入图片嵌入型为何图片位置靠上,如何才能让图片与文字在一条水平线上??? 如何几张图片拼成一个文字信息发出去? iphone蓝牙耳机怎么连接手机 冬季养生靓汤 冬季有哪些养生靓汤 脚底下突然有个硬坑 孩子不愿意做作业怎么办 如何解决孩子不愿写作业 马鞍山市九年级思想品德2009-2010学年度第一学期期末考试,九年级思想品德 NodeJS 在异步函数(async/await)中调用栈打印不全的问题 为什么家长给双胞胎都要穿一样的衣服? 为什么双胞胎都穿一样的衣服? 天猫精灵怎么联网 天猫精灵联网方法 为什么大多数的双胞胎都穿一样的衣服? 弟弟为什么和哥哥穿的一样颜色的衣服? 双胞胎一定要穿一样的衣服吗,甚至连颜色 双胞胎宝宝穿衣服一定要一样吗 google关键词查询在哪个网站比较专业? 生了双胞胎以后,必须要给双胞胎穿不同款的衣服吗? 菠萝怎么煮好吃 菠萝如何煮好吃 双胞胎女孩一样的的衣服混穿合适吗? 泉天下热水器是怎么解决水垢问题的? 快手怎么退出登录另一个账号,快手怎么退出登录账号 同一个人的手机号和qq号分别能申请两个吗? 怎么用一个手机号创两个? 红烧大骨头的做法 酱香浓郁大口啃 为什么一天不洗,头发就出油?而有人可以几天不洗,依旧飘逸? qq怎么申请 如何申请多个 一个手机可以申请两个吗?