关于
关于js内异步的问题,一直都是个*痛的点;
因为js单线程造成的无可避免的会产生异步操作,单因为单线程也让js更方便管理,不用处理多个线程间的麻烦 - 当然这只是我个人意见,如果有问题欢迎指出
而纵观js异步发展史,
从
- 回调函数(callback)
- 新对象 promise
- 新方法 generator
- 如今 async
在同一道路上,产生的各种方案可以发现异步问题是有多么的紧迫,而我们所期望的是什么?
就是在进行异步的操作时候,我们不关心它到底是不是异步操作,我只想要一个结果,而产生这个结果的过程我不需要在乎!
那解决这个问题的答案是什么?那就是async
可以说,这是操作异步有史以来最简单的一次了。
随着前端时间 Node v7.6 版本更新后 Node 原生支持 async
/await
方法,似乎以后我们就不需要那么关心异步问题了呢~(/偷笑)
async 函数
解释
async
函数,简单说async
函数本身是Generator
的语法糖,因为它本身并没有应用新的技术点
在koa v1.* 里面异步主要使用ES6里面多Generator
外加 co (用于 generator 函数的自动执行) 来解决异步的问题
看一段使用 Generator
的异步操作代码:
|
|
然后是使用了 async
之后的:
|
|
async优点
async 函数对 Generator 函数的改进,体现在以下三点。
内置执行器。 Generator 函数的执行必须靠执行器,所以才有了 co 函数库,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数一模一样,只要一行。
更好的语义。 async 和 await,比起星号和 yield,语义更清楚了。async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。
- 更广的适用性。 co 函数库约定,yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以跟 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)。
async使用
相比generator来说async更灵活一些,且async
返回的都是promise对象,这样更好操作一些,也就是异步操作都统一处理promise对象
这里提一点在处理promise的时候要处理好异常问题,因为promise运行中出现异常会中断后续任务,当然这个和使用async没啥关系,突然想到了这里~
详细使用可以参考阮大或廖大的博文
参考资料
async 函数的含义和用法
koa 学习心得及核心源码分析
Koa 框架 – JavaScript 标准参考教程(alpha
Koa (koajs) – 基于 Node.js 平台的下一代 web 开发框架
ECMAScript 6 入门 - Generator 函数的语法
koa处理URL - 廖雪峰的官方网站