## 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模塊的源碼
#### 處理并發的異步操作