【Promise 源码学习】第十七篇 - async/await 简介
一,前言
上一篇,主要介绍了 co 库的使用和实现原理,主要涉及以下几个点:
co 库的简介:特性、用法、功能分析;
co 库的实现和原理分析;
本篇,继续介绍 async/await:
async/await 是基于 generator 的语法糖
async/await 是 generator + co 的组合;
async/await 是“回调地狱”问题的终极解决方案;
二,async/await 的使用
试场景:读取 a.txt 得到结果 b.txt;读取 b.txt 得到结果 c;
之前,使用 generator + co 组合,已经让代码看上去很像是同步了,但仍需要 co 库的支持;
使用 async/await:在外层 function 前添加 async;await 右侧的方法返回 promise;无需 co 库支持即可实现;
这样,代码看上去与“同步编码”无任何明显差异,有效避免了嵌套回调问题;
三,async/await 的实现
还是将 async/await 代码放入 babel.io,查看编译后的代码:
以上代码可以看出,_read
函数就是之前实现的 generator 函数,这就说明 async 最终会被转换成为 generator 生成器;
执行过程分析:
第一次调用异步迭代方法,传入 undefined:
_next(undefined);
,进入asyncGeneratorStep
方法:gen 是 it 迭代器,key 是 next 方法;如果没完成,继续调用
_next
(递归),继续取出下一个执行异步迭代;
所以,async/await 其实也就是 generator + co 的语法糖;
编码中,所有异步回调代码可以全部采用 async/await 写法替换,可以有效解决回调嵌套问题;
四,结尾
本篇,主要介绍了 async/await 的使用和实现原理,主要涉及以下几个点:
async/await 的使用和功能分析;
async/await 的实现和原理分析;
下一篇,继续介绍浏览器的事件环 EventLoop;
评论