## Generator函数的异步引用
### 传统方法
在ES6之前,异步编程的方法大概有以下4种:
- 回调函数
- 事件监听
- 发布/订阅
- `Promise`对象
### 基本概念
#### 异步
所谓异步,就是任务不是连续完成的,可以理解成任务被分解成两段,先执行第一段,然后转而执行其他任务,等第一段完成后再回过头来执行第二段。
#### 回调函数
以前对异步的处理是使用回调函数,所谓回调函数,就是把任务的第二段单独放在一个函数里,等到重新执行这个任务时直接调用这个函数,这就是 `callback`。
```js
// 读取文件
fs.readFile('/etc/passwd', 'utf-8', function (err, data) {
if (err) throw err
console.log(data)
})
```
#### Promise
回调函数本身没问题,问题在于多个回调会嵌套,导致代码不清晰。`Promise` 对象就是为了解决这个问题被提出的。
### Generator函数
#### 协程
协程就是多个线程相互协作,完成异步任务。
#### 协程的Generator函数实现
#### Generator函数的数据交换和错误处理
#### 异步任务的封装
### Thunk函数
#### 参数的求值策略
#### Thunk函数的含义
#### JavaScript语言的Thunk函数
#### Thunkify模块
#### Generator函数的流程管理
#### Thunk函数的自动流程管理
### co模块
#### 基本用法
#### co模块的原理
#### 基于Promise对象的自动执行
#### co模块的源码
#### 处理并发的异步操作