# es6的generator是什么?
generator指的是
```
function* xxx(){
}
```
是es6里的寫法。
```
function* test() {
console.log('1');
yield 1;
console.log('2');
yield 2;
console.log('3');
}
```
代碼中間插了兩行yield,代表什么呢?
- 當test執行到 yield 1這一行的時候,程序將被掛起,要等待執行下一步的指令;
- 當接收到指令后,test將繼續往下運行,直到yield 2這一行,然后程序又被掛起并等待指令;
- 收到指令后,test又將繼續運行,而下面已經沒有yield了,那么函數運行結束。
這是不是就像,我們調試代碼的時候,給插的斷點 ?
當然,斷點這個比喻,只是表象上比較相像,實質原理還是有非常大差異。
yield就是讓后面的generator執行完成后,才繼續往下走。
要注意,function后面多了一個星號,這樣是表明這個函數將變成一個生成器函數,而不是一個普通函數了。意思就是,test這個函數,將不能被這樣執行
test();
但可以獲得一個生成器
var gen = test(); // gen就是一個生成器了
然后,生成器可以通過next()來執行運行
gen.next();
也就是上面說的,讓函數繼續運行的指令。
簡單地總結一下:
- 生成器通過yield設置了一些類似”斷點“的東西,使得函數執行到yield的時候會被阻斷;
- 生成器要通過next()指令一步一步地往下執行(兩個yield之間為一步);
- yield 語句后面帶著的表達式或函數,將在阻斷之前執行完畢;
- yield 語句下面的代碼,將不可能在阻斷之前被執行;
由此可以看出,yield是如何將異步非阻塞代碼,變成 異步阻塞代碼。
- Introduction
- Nodejs 4.x新特性
- classes
- typed arrays
- generators
- collections
- Set
- Map
- arrow functions
- block scoping
- template strings
- promises
- symbols
- Koa基礎
- 上下文
- koa-generator
- 安裝
- 創建項目
- 更改視圖模板引擎
- Routes
- HTTP
- Get
- 如何獲取query參數
- 如何獲取params
- Post
- 從post獲取參數
- 標準表單(Post with x-www-form-urlencoded)
- 文件上傳(Post with form-data)
- Post with raw
- 數據庫
- MySQL
- Mongo
- 流程控制
- generator/co
- es6的generator是什么?
- co = generator + promise
- async/await
- promise with bluebird
- 測試
- Mocha
- Supertest
- 部署
- 最佳實踐
- FAQ
- 如何發布本書到git pages
- 如何知道require模塊的用法
- koa中的異常處理