停止像这样使用 “async/await“,改用原版

打印 上一主题 下一主题

主题 835|帖子 835|积分 2505

有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。
  本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。
  作者:Marina Mosti 译者:前端小智 来源:medium 原文:https://blog.bitsrc.io/stop-using-async-await-like-this-use-the-original-instead-172b5df17589
最近看到一些开发者使用这种方法来处理 async/await 错误。
  1. /**
  2. * @param { Promise } promise
  3. * @param { Object= } errorExt - Additional Information you can pass to the err object
  4. * @return { Promise }
  5. */
  6. function to(promise, errorExt) {
  7.   return promise
  8.     .then((data) => [null, data])
  9.     .catch((err) => {
  10.       if (errorExt) {
  11.         const parsedError = Object.assign({}, err, errorExt);
  12.         return [parsedError, undefined];
  13.       }
  14.       return [err, undefined];
  15.     });
  16. }
  17. async function doSomething() {
  18.   const [error1, result1] = await to(fetch(''));
  19.   if (error1) {
  20.     return;
  21.   }
  22.   const [error2, result2] = await to(fetch(result1));
  23.   if (error2) {
  24.     return;
  25.   }
  26.   // ...
  27. }
复制代码
正如你所看到的,他们把函数包起来,把原来的Promise转换成一个肯定会成功的 “Promise”,并返回一个数组。
如果原始的Promise成功了,那么数组中的第一项是空的,表示没有错误,第二项是原始 Promise的结果。如果原来的Promise失败了,那么数组的第一项是错误,第二项是未定义。就是这样了。
他们认为这很优雅,使代码更易读。但我不这么认为,也不建议这样使用它
我认为这样的封装有点过度,在大多数情况下,不需要这样做。接下来,我将从两个角度说明我的观点。
1. 从设计的角度来看

Async/await API的目的是允许开发者像写同步代码一样写异步代码。因此,可以使用try...catch来捕获async/await错误。
而这样的函数似乎为我们考虑到了一切,但其他刚看到你的代码的开发者总会有这样的疑问。为什么to函数返回的Promise所使用的await没有用try...catch来包装?

只有找到原始的to函数定义,并理解其意图,你才能知道 “啊,原来to函数返回的 Promise 永远不会被拒绝”。
所以它进一步增加了其他开发者的理解成本,使得熟悉的 async/await 变得不再 “熟悉”。
2. 从实用性的角度来看

to函数的主要使用情况是,在同一上下文中有多个await promises,而它们相应的错误处理方式是不同的。那么就使用这个封装函数对每个错误进行不同的处理,减少对try...catch的使用。
但在实际开发,在每个到函数之后,你需要使用if语句来确定是否有错误。这与使用try...catch的本意没有什么不同,都是为了检查错误。

其次,在真实的生产环境中,下一个Promise依赖上一个Promise的情况并不少见。但重要的一点是,这两个Promise通常是关联函数。所以在外层使用try...catch来统一处理错误是没有问题的。比如说

最后,在JavaScript中,大多数Promise场景都是在 Input/output上,比如网络IO和文件IO。这些IO场景可以将拦截器封装在下层,并根据错误代码统一处理。例如,使用axios拦截器。

所以它可能并不像预期的那样实用。也就是说,它可能只用于整个项目的一小部分,而且成本超过了收益。
这就是我所有的观点,你怎么看?你赞成这种做法吗?
编辑中可能存在的bug没法实时知道,事后为了解决这些bug,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug
交流

文章每周持续更新,可以微信搜索「 大迁世界 」第一时间阅读和催更(比博客早一到两篇哟),本文 GitHub https://github.com/qq449245884/xiaozhi 已经收录,整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,另外关注公众号,后台回复福利,即可看到福利,你懂的。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表