async和await

关于

关于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 的异步操作代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var fs = require('fs');
var readFile = function (fileName){
return new Promise(function (resolve, reject){
fs.readFile(fileName, function(error, data){
if (error) reject(error);
resolve(data);
});
});
};
var gen = function* (){
var f1 = yield readFile('/etc/fstab');
var f2 = yield readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};

然后是使用了 async 之后的:

1
2
3
4
5
6
var asyncReadFile = async function (){
var f1 = await readFile('/etc/fstab');
var f2 = await readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};

async优点

async 函数对 Generator 函数的改进,体现在以下三点。

  1. 内置执行器。 Generator 函数的执行必须靠执行器,所以才有了 co 函数库,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数一模一样,只要一行。

  2. 更好的语义。 async 和 await,比起星号和 yield,语义更清楚了。async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。

  3. 更广的适用性。 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 - 廖雪峰的官方网站