重学 JS | 异步编程 async/await
async
是 ES2017 推出的函数,也是异步编程的解决方案,字面是异步的意思,那么使用它就应该不会阻塞后面代码的执行。首先我们来看个日常用法:
从例子中我们可以总结出:
async
关键字放在函数前,表示函数为异步函数await
关键字是等待的意思,需要等后面的表达式执行结束,才往下走await
关键字只能在async
函数内部使用
知道了async/await
的用法,看到单独使用async
函数是什么效果。
可以看出async()
函数返回的是Promise
对象,而且Promise
有个resolved
。我们可以大胆推测,当async()
函数有返回值时,会通过Promise.resolve()
函数进行封装,返回一个Promise
对象。同理,如果内部发生异常,则会使用Promsie.reject()
函数进行封装返回。
这里结合例子 1 的写法,也可以看出,async
函数返回的是Promise
对象,要获取返回值可以使用await
关键字,但需等待await
后面表达式执行结束返回。
了解了Async
函数的基础用法,那async
函数是什么呢?
async 函数实际上是 Generator 函数的语法糖。
可以看出,async
函数就是将Generator
函数的星号替换成async
,将yield
替换成await
,只不过async
函数对Generator
函数做了改进。
内置执行器
Generator
函数执行必须靠执行器,调用next
方法,或者用co
模块;而async
函数自带执行器,能像普通函数一样直接执行。
返回值是
Promise
async
函数返回值是Promise
对象,比而Generator
函数返回的是Iterator
对象方便多。
更好的语义
async 和await
,比起星号和yield
,语义更清楚了。async
表示函数里有异步操作,await
表示紧跟在后面的表达式需要等待结果
更广的适用性
co
模块约定,yield
命令后面只能是 Thunk
函数或 Promise
对象,而async
函数的await
命令后面,可以是 Promise
对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved
的 Promise
对象)。
这里关于Generator
函数的学习,可以参考下面文章:
至此我们完成了 async 异步函数的学习。
版权声明: 本文为 InfoQ 作者【梁龙先森】的原创文章。
原文链接:【http://xie.infoq.cn/article/182ff3869615b69742239d720】。文章转载请联系作者。
评论