重学 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】。文章转载请联系作者。











评论