范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  原文来自公众号@若川视野,https://mp.weixin.qq.com/s/a66zzIIo28n7r1AHbNwUhQ1、前言
  学而不思则罔
  最近有在读一些比较优秀的npm包的代码,起因是感觉自己现在写的代码还是不够规范,不够简洁。
  可是我又不知道到底什么样的代码才算是比较好 的代码,在进行一番思考过后我认为还是要站在巨人的肩膀上。
  通过阅读优秀的源码并从中学习如何写出让人觉得赏心悦目的代码最后再写文进行章总结对整个学习的过程进行一个梳理同时分享给其他人。
  为什么要在开头写这么多呢?因为我需要为自己坚持下去找一个理由。这样我才能乘风破浪,一往无前。
  话不多说,开始总结。 2、JS异步编程进化之路
  回调地狱阶段
  在正式介绍await-to-js这个库之前,让我们先简单的回顾一下有关于在JavaScript这门语言中,异步编程的进化之路。在Promise没出现之前,异步编程一直是困扰着前端工程师的一个大难题,当时的前辈可能会经常看到下面这种代码。  function AsyncTask() {    asyncFuncA(function(err, resultA){       if(err) return cb(err);        asyncFuncB(function(err, resultB){          if(err) return cb(err);            asyncFuncC(function(err, resultC){                if(err) return cb(err);                 // And so it goes....           });       });    }); }
  这种同时在纵向和横向延伸的回调中嵌套着回调的代码又被称为回调地狱 。可见这玩意让人多么恶心,具体来说有以下这几个缺点 难以维护(看都不想看,还维护个**)  难以捕捉到错误(一个一个找?) 总而言之,这个问题在当时是很需要被解决的,所以在ES6中,出现了Promise。
  Promise阶段
  Promise是一种优雅 的异步编程解决方案。从语法上来将,它是一个对象, 代表着一个异步操作最终完成或失败,从语意上来讲,它是承诺,承诺过一段时间给你一个结果。
  由于它的原型存在then,catch,finally会返回一个新的promise所以可以允许我们链式调用,解决了传统的回调地狱的问题。
  由于它本身存在all方法,所以可以支持多个并发请求,获取并发请求中数据。
  有了Promise后,上面的代码可以被写成下面这样。 function asyncTask(cb) {    asyncFuncA.then(AsyncFuncB)       .then(AsyncFuncC)       .then(AsyncFuncD)       .then(data => cb(null, data)       .catch(err => cb(err)); }
  相比较于上面的回调地狱,使用Promise可以帮助我们让代码只在纵向发展,并且提供了处理错误的回调。显然优雅了很多。不过就算Promise已经这么优秀了,可是依然存在两个每种不足的地方 不够同步(代码依然会纵向延伸)  不能给每一次异步操作都进行错误处理 这也就是为什么ES7中会出现async/await,号称 异步编程的最后解决方案 的原因了。
  async/await
  async 函数是Generator 函数的语法糖。使用 关键字async 来表示,在函数内部使用await 来表示异步。相较于Generator ,async 函数的改进在于下面四点: 内置执行器 。Generator 函数的执行必须依靠执行器,而async 函数自带执行器,调用方式跟普通函数的调用一样 更好的语义 。async 和await 相较于* 和yield 更加语义化 更广的适用性 。co 模块约定,yield 命令后面只能是 Thunk 函数或 Promise对象。而async 函数的await 命令后面则可以是 Promise 或者 原始类型的值(Number,string,boolean,但这时等同于同步操作) 返回值是 Promise 。async 函数返回值是 Promise 对象,比 Generator 函数返回的 Iterator 对象方便,可以直接使用then() 方法进行调用
  此处总结参考自:理解async/await[1]
  有了async/await,上面的代码可以被改写成下面这样 function async asyncTask(cb) {   const asyncFuncARes = await asyncFuncA()   const asyncFuncBRes = await asyncFuncB(asyncFuncARes)   const asyncFuncCRes = await asyncFuncC(asyncFuncBRes) }
  同时我们可以对每一次异步操作进行错误处理 function async asyncTask(cb) {     try {       const asyncFuncARes = await asyncFuncA()     } catch(error) {       return new Error(error)     }     try {       const asyncFuncBRes = await asyncFuncB(asyncFuncARes)     } catch(error) {       return new Error(error)     }     try {       const asyncFuncCRes = await asyncFuncC(asyncFuncBRes)     } catch(error) {       return new Error(error)     } }
  这样一来上面Promise存在的两个每种不足的地方是不是就被优化了呢?所以说async/await是JS中异步编写的最后解决方案我个人觉得一点问题没有,但是我不知道你看上面的代码,每一次异步操作都要用try/catch进行错误处理是不是感觉不够方便不够智能呢? 3、await-to-js-小而美的npm包
  基本用法
  作者是这样介绍这个库的
  Async await wrapper for easy error handling without try-catch。
  中文翻译过来就是
  无需 try-catch 即可轻松处理错误的异步等待包装器。
  这里做个简单的对比,之前我们在异步操作中处理错误的方法是这样的 function async asyncTask() {     try {       const asyncFuncARes = await asyncFuncA()     } catch(error) {       return new Error(error)     }     try {       const asyncFuncBRes = await asyncFuncB(asyncFuncARes)     } catch(error) {       return new Error(error)     }     try {       const asyncFuncCRes = await asyncFuncC(asyncFuncBRes)     } catch(error) {       return new Error(error)     } }
  而用了await-to-js之后,我们可以这样的处理错误 import to from "./to.js"; function async asyncTask() {    const [err, asyncFuncARes]  = await to(asyncFuncA())    if(err) throw new (error);        const [err, asyncFuncBRes]  = await tp(asyncFuncB(asyncFuncARes))    if(err) throw new (error);        const [err, asyncFuncCRes]  = await to(asyncFuncC(asyncFuncBRes)    if(err) throw new (error); }
  是不是简洁多了呢?
  作者究竟用了什么黑魔法?
  你可能不信,源码只有仅仅15行。
  源码分析export function to (   promise: Promise,   errorExt?: object ): Promise<[U, undefined] | [null, T]> {   return promise     .then<[null, T]>((data: T) => [null, data])     .catch<[U, undefined]>((err: U) => {       if (errorExt) {         const parsedError = Object.assign({}, err, errorExt);         return [parsedError, undefined];       }        return [err, undefined];     }); }  export default to;
  上面这里是TS版的源码,但是考虑到有些同学可能还没接触过TS,我着重分析一下下面这版JS版的源码。 export function to(promise, errorExt) {     return promise         .then((data) => [null, data])         .catch((err) => {         if (errorExt) {             const parsedError = Object.assign({}, err, errorExt);             return [parsedError, undefined];         }         return [err, undefined];     }); } export default to;
  这里我们先抛开errorExt这个自定义的错误文本,核心代码是这样的 export function to(promise) {     return promise         .then((data) => [null, data]) // 成功,返回[null,响应结果]         .catch((err) => {             return [err, undefined]; // 失败,返回[错误信息,undefined]     }); } export default to;
  可以看出,其代码的逻辑用中文解释是这样的 无论成功还是失败都返回一个数组,数组的第一项是和错误相关的,数组的第二项是和响结果相关的  成功的话数组第一项也就是错误信息为空,数组第二项也就是响应结果正常返回  失败的话数组第一项也就是错误信息为错误信息,数组第二项也就是响应结果返回undefined
  经过上面的分析我们可以认定,世界上没有什么黑魔法,没有你做不到,只有你想不到。
  这里我们再来看函数to的第二个参数errorExt不难发现,这玩意其实就是拿来用户自定义错误信息的,通过Object.assign 将正常返回的error和用户自定义和合并到一个对象里面供用户自己选择。 4、结语
  源码不可怕,可怕的是自己的面对未知的恐惧感。
  敢于面对,敢于尝试,才能更上一层楼。
  继续加油,少年。
  5、参考资料仓库地址:https://github.com/scopsy/await-to-js  官方文章: How to write async await without try-catch blocks in Javascript[2]  参考资料
  [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/

中邮通信出品,Hinova9Pro评测,100瓦快充是什么体验?在5G时代,越来越多的产品集中于几大头部厂商。似乎对于我们消费者来说,能选择的面越来越窄了。最近我收到了这台Hinova9Pro,Hinova是中国邮电器材集团有限公司推出的全新品华为联合制造业巨头探索数字经济北京样本本文作者北京日报刘洋发展数字经济是新一轮科技革命和产业变革的大势所趋。对于正在尝试把握数字化发展趋势,为经济高质量发展注入新动能,努力打造改革开放北京样板的首都而言,数字经济是国家上证早知道2021年12月20日今日导读5G消息联合实验室揭牌成立在即正式商用渐行渐近锂价刷新近年新高智利选举或影响锂资源供给释放中装建设拟开发元宇宙应用农尚环境与华夏芯合作联美控股拟入股爱德曼氢能三木集团实控人手机有内置独立音乐芯片又如何,发烧友还是和Walkman味道不同当下的智能手机功能可以说是越来越丰富,并且大多都打上了专业的旗号,不过有些手机功能想取代专业器材还会很难实现的,比如在音乐播放能力方面,即使现在很多手机厂商号称手机内置独立音乐芯片Centos7安装python3纯傻瓜式步骤,保证成功。下面的操作,按照步骤来就可以了,不要在中途cd到别的文件目录下,要想查看效果可以用ls加上对应的目录,不需要切换进去。首先不管你当前在哪个目录下,输入以下命向日葵12重磅首发144帧高刷新率,远控提速140十二年至诚守护,探索极致远控更多可能。2021下半年刚刚拉开帷幕,创新型远程连接SaaS服务商贝锐旗下远程控制品牌向日葵,迎来了全新大版本向日葵12的重大发布。远控速度全新突破,最诺基亚要搭载鸿蒙?同样是通讯巨头,诺基亚比想象中更强大曾几何时,手机市场中有这样一个巨头,一年的手机销量可以达到2。5亿台。全球各个角落,几乎都能见到它的产品,这个巨头就是诺基亚。然而这才过了短短十几年的时间,诺基亚在手机市场中几乎彻FF新概念车DeusX关注我,了解更多酷车速递FaradayFuture是乐视创始人贾跃亭打造的新能源汽车品牌,简称FF(法拉第未来)。因为造车计划总是跳票,一直停留在纸面被人诟病为PPT造车。还有他非继传感器和芯片后华米再放大招,将发布自研OS此前,华米科技宣布将于7月13日在合肥召开主题为TheFutureofHealth的NextBeat大会。今天,官方发布新的预热海报,提出了在魔改的捷径面前,并非巨头的我们凭什么敢Aqara门窗传感器P1发布,300元不到的智能家居解决方案来袭对于当下年轻人来说,简约便捷的智能家居生活已经成为装修的主流选择。但由于不少打出智能名号的家电售价较为昂贵,普通家庭根本无法承担昂贵的联动设备费用支出,以至于不少小伙伴对于智能家居E拆解虽然荣耀50没有了麒麟芯片,但国产射频脱颖而出荣耀50系列是荣耀独立后的首款数字系列,需要面临的困难是可想而知的,荣耀50系列的首销成功,也证明了荣耀的号召力依然在。拆解没有了麒麟芯片的荣耀50,对eWisetech来说也是必
为什么8700k和9700k卖一个价格呢?现在酷睿8700K盒装的价格在2700元左右,9700K则在3000元左右,还是比8700K贵一些的,毕竟物理核心数比8700K多了两个,同样是14nm工艺下芯片面积和成本应该都要跟我学Nginx,nginx的连接处理方式nginx支持多种连接处理方式,特定方法的可用性取决于所使用的平台(如WindowsLinuxMacOS)。在支持多种方法的平台上,nginx通常会自动选择最有效的方法。如果需要自女生想找一个靠谱的全职或兼职,看了几天,为什么那么难?亲,兼职有好多种哦。不知你所哪个城市呢?因为不知你具体的情况,我就简单说说可以兼职的几种情况。第一,网络时代,可以做今日头条,创作收益,有部手机,随时随地都可以,我一般是吃饭时间,半夜跑滴滴的都是些什么人?凌晨三四点在跑滴滴的究竟是什么人?不是生活所迫,谁不想老婆孩子热炕头,而半夜还在跑滴滴。随着智能手机的不断的发展,手机上为了方便生活的软件也开始多了起来,遍及人们的衣食住行。其中在华为开发者大会HDC2021将于10月22日举行,HarmonyOS3。0即将到来日前华为发布邀请函,宣布2021年的HDC华为开发者大会将于10月22日举行。而从华为公布的信息来看,这次的HDC大会重点依然是鸿蒙系统,还有华为的HMS移动服务生态。外界有不少人比尔盖茨预言成功!华为宣布再次撤资,最终还是做出了选择在当下的商业环境中,很多企业都以上市为目标,完成上市后,不仅各家投资方都拿到了回报,归属于企业创始人的财富也水涨船高。然而在国内,仍旧有些企业在未上市的背景下依然取得傲人战绩,比如佳能EOSR5是不是工程机上市销售?佳能EOSR5是不是工程机上市销售?有一些摄影人有这种疑惑,我们不妨简单分析一回首先,要清楚何为工程机?所谓工程机是指即将进入量产,但还没有完成最后调试,在最后测试阶段的相机。工程华为手机的talkback如何关掉相信很多使用华为用户的朋友们都会可能会遇到一种现象,就是不知不觉的时候,不知道什么情况下手机突然出现播报声音,屏幕显示手机出现住院talkback模式,不知道咋办?我今天下午的时候出门在外如何让手机电量更持久耐用?节电小窍门原标题出门在外如何让手机电量更持久耐用?节电小窍门问出门在外,手机怎么用才能更省电?答您可以试试关闭这些服务,既不影响一般日常使用又能让掉电放慢速度。(以下设置方法以苹果手机为例,苹果手机在国内很热销。你怎么看待这种现象?感谢您的阅读!苹果手机在国内很热销,那么你怎么看待这种情况?苹果手机确实在国内的销量表现非常的出色。那么为什么苹果手机在国内的销量表现如此出色呢?是什么原因导致用户愿意苹果手机呢?改善生活质量,不要浪费生命,秋季值得入手的家居新品家电改善生活质量,不要浪费生命,秋季值得入手的家居新品家电秋天到了,又是一个收获的季节。经历了漫长慵懒的夏季,最好的秋季来了。天气好,身体好,可以入手一些好的家电,让家里焕然一新,让自