ES2017 标准引入了 async 函数,使得异步操做变得更加方便。异步
async 函数是什么?一句话,它就是 Generator 函数的语法糖。async
前文有一个 Generator 函数,依次读取两个文件。函数
写成async
函数,就是下面这样。code
一比较就会发现,async
函数就是将 Generator 函数的星号(*
)替换成async
,将yield
替换成await
,仅此而已。对象
async
函数对 Generator 函数的改进,体如今如下四点。字符串
(1)内置执行器。同步
Generator 函数的执行必须靠执行器,因此才有了co
模块,而async
函数自带执行器。也就是说,async
函数的执行,与普通函数如出一辙,只要一行。it
上面的代码调用了asyncReadFile
函数,而后它就会自动执行,输出最后结果。这彻底不像 Generator 函数,须要调用next
方法,或者用co
模块,才能真正执行,获得最后结果。yield
(2)更好的语义。语法
async
和await
,比起星号和yield
,语义更清楚了。async
表示函数里有异步操做,await
表示紧跟在后面的表达式须要等待结果。
(3)更广的适用性。
co
模块约定,yield
命令后面只能是 Thunk 函数或 Promise 对象,而async
函数的await
命令后面,能够是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操做)。
(4)返回值是 Promise。
async
函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你能够用then
方法指定下一步的操做。
进一步说,async
函数彻底能够看做多个异步操做,包装成的一个 Promise 对象,而await
命令就是内部then
命令的语法糖。