55. 精读《async await 是把双刃剑》
本周精读内容是 《async/await 是把双刃剑》。
1 引言
终于,async/await 也被吐槽了。Aditya Agarwal 认为 async/await 语法让我们陷入了新的麻烦之中。
其实,笔者也早就觉得哪儿不对劲了,终于有个人把实话说了出来,async/await 可能会带来麻烦。
2 概述
下面是随处可见的现代化前端代码:
await 语法本身没有问题,有时候可能是使用者用错了。当 pizzaData
与 drinkData
之间没有依赖时,顺序的 await 会最多让执行时间增加一倍的 getPizzaData
函数时间,因为 getPizzaData
与 getDrinkData
应该并行执行。
回到我们吐槽的回调地狱,虽然代码比较丑,带起码两行回调代码并不会带来阻塞。
看来语法的简化,带来了性能问题,而且直接影响到用户体验,是不是值得我们反思一下?
正确的做法应该是先同时执行函数,再 await 返回值,这样可以并行执行异步函数:
或者使用 Promise.all
可以让代码更可读:
看来不要随意的 await,它很可能让你代码性能降低。
3 精读
仔细思考为什么 async/await 会被滥用,笔者认为是它的功能比较反直觉导致的。
首先 async/await 真的是语法糖,功能也仅是让代码写的舒服一些。先不看它的语法或者特性,仅从语法糖三个字,就能看出它一定是局限了某些能力。
举个例子,我们利用 html 标签封装了一个组件,带来了便利性的同时,其功能一定是 html 的子集。又比如,某个轮子哥觉得某个组件 api 太复杂,于是基于它封装了一个语法糖,我们多半可以认为这个便捷性是牺牲了部分功能换来的。
功能完整度与使用便利度一直是相互博弈的,很多框架思想的不同开源版本,几乎都是把功能完整度与便利度按照不同比例混合的结果。
那么回到 async/await 它的解决的问题是回调地狱带来的灾难:
为了减少嵌套结构太多对大脑造成的冲击,async/await 决定这么写:
虽然层级上一致了,但逻辑上还是嵌套关系,这不是另一个程度上增加了大脑负担吗?而且这个转换还是隐形的,所以许多时候,我们倾向于忽略它,所以造成了语法糖的滥用。
理解语法糖
虽然要正确理解 async/await 的真实效果比较反人类,但为了清爽的代码结构,以及防止写出低性能的代码,还是挺有必要认真理解 async/await 带来的改变。
首先 async/await 只能实现一部分回调支持的功能,也就是仅能方便应对层层嵌套的场景。其他场景,就要动一些脑子了。
比如两对回调:
如果写成下面的方式,虽然一定能保证功能一致,但变成了最低效的执行方式:
因为翻译成回调,就变成了:
然而我们发现,原始代码中,函数 c
可以与 a
同时执行,但 async/await 语法会让我们倾向于在 b
执行完后,再执行 c
。
所以当我们意识到这一点,可以优化一下性能:
但其实这个逻辑也无法达到回调的效果,虽然 a
与 c
同时执行了,但 d
原本只要等待 c
执行完,现在如果 a
执行时间比 c
长,就变成了:
看来只有完全隔离成两个函数:
或者利用 Promise.all
:
这就是我想表达的可怕之处。回调方式这么简单的过程式代码,换成 async/await 居然写完还要反思一下,再反推着去优化性能,这简直比回调地狱还要可怕。
而且大部分场景代码是非常复杂的,同步与 await 混杂在一起,想捋清楚其中的脉络,并正确优化性能往往是很困难的。但是我们为什么要自己挖坑再填坑呢?很多时候还会导致忘了填。
原文作者给出了 Promise.all
的方式简化逻辑,但笔者认为,不要一昧追求 async/await 语法,在必要情况下适当使用回调,是可以增加代码可读性的。
4 总结
async/await 回调地狱提醒着我们,不要过度依赖新特性,否则可能带来的代码执行效率的下降,进而影响到用户体验。同时,笔者认为,也不要过度利用新特性修复新特性带来的问题,这样反而导致代码可读性下降。
当我翻开 redux 刚火起来那段时期的老代码,看到了许多过度抽象、为了用而用的代码,硬是把两行代码能写完的逻辑,拆到了 3 个文件,分散在 6 行不同位置,我只好用字符串搜索的方式查找线索,最后发现这个抽象代码整个项目仅用了一次。
写出这种代码的可能性只有一个,就是在精神麻木的情况下,一口气喝完了 redux 提供的全部鸡汤。
就像 async/await 地狱一样,看到这种 redux 代码,我觉得远不如所谓没跟上时代的老前端写出的 jquery 代码。
决定代码质量的是思维,而非框架或语法,async/await 虽好,但也要适度哦。
PS: 经过讨论,笔者把原文 async/await 地狱标题改成了 async/await 是把双刃剑。因为 async/await 并没有回调地狱那么可怕,称它为地狱有误导的可能性。
5 更多讨论
讨论地址是:精读《async/await 是把双刃剑》 · Issue #82 · dt-fe/weekly
如果你想参与讨论,请点击这里,每周都有新的主题,周末或周一发布。
55. 精读《async await 是把双刃剑》相关推荐
- 精读《async/await 是把双刃剑》 存在的问题和解决方法
原文链接: 精读<async/await 是把双刃剑> 存在的问题和解决方法 上一篇: es6 async/await 定时函数 下一篇: 精读<async/await 是把双刃剑& ...
- 精读《async/await 是把双刃剑》
(点击上方公众号,可快速关注) 作者:黄子毅 segmentfault.com/a/1190000014753495 1 引言 终于,async/await 也被吐槽了.Aditya Agarwal ...
- Python 异步 IO 、协程、asyncio、async/await、aiohttp
From :廖雪峰 异步IO :https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152 Python Async/Awai ...
- Python 异步 async/await(进阶详解)
文章目录 CPU的时间观 I/O(异步的瓶颈) 基础概念 进程/线程 阻塞/非阻塞 并发/并行 CPU调度策略 同步/异步 事件循环+回调 协程(异步) async/await asyncio事件循环 ...
- setTimeout、setInterval、promise、async/await的顺序详解(多种情况,非常详细~)
本文很长,列举的情况很多. 在阅读本文之前,如果您有充足的时间,请新建一个项目与本文一同实践. 每段代码都有对应的解释,但是自己动手尝试印象才会更深哦~ setInterval:表示多久执行一次,需要 ...
- C# async await 学习笔记2
C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...
- promise 和 async await区别
什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. as ...
- angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )
Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们 ...
- async await:比requests 更强大
最近公司 Python 后端项目进行重构,整个后端逻辑基本都变更为采用"异步"协程的方式实现.看着满屏幕经过 async await(协程在 Python 中的实现)修饰的代码,我 ...
最新文章
- Redis: Redis Desk Manager Setup
- 【Paper】2018_多机器人领航-跟随型编队控制
- 用python定义一个员工类_python3 类的定义
- flink 运行一段时间 内存溢出_Flink之运行时环境
- vb 如何给静态变量赋初值
- SpringBoot2.x填坑(一):使用CROS解决跨域并解决swagger 访问不了问题
- Wind对接pytho总结
- 相机打开显示服务器错误,Win10相机打不开报错“0xa00f4244”怎么解决?
- android 模拟器 pubg,雷电安卓模拟器怎么玩绝地求生刺激战场 PC端带你愉快吃鸡...
- 解决vue项目运行出现warnings potentially fixable with the `--fix` option.的报错问题
- 华硕服务器主板引导设置,装系统时的引导设置_华硕 ROG Rampage VI Apex_主板评测-中关村在线...
- jpa mysql_Spring boot通过JPA访问MySQL数据库
- LeetCode1079题:活字印刷——Python递归与迭代解法
- Python实战系列-上海银行间同业拆借利率最新报错解决方案
- Django 做个小后台,细节在完善一点点,滚雪球学 Python 第三阶段
- R语言——基于主成分分析的自杀影响因素降维
- 计算机函数公式mod,excel函数公式大全,教您常用的Excel函数
- 清华版三年级上册计算机教案,清华大学信息技术三年级上册教案
- 互联网思维:3个段子,9大分类,19条法则
- 机器学习推荐系统评价指标之AUC