Generator函數是ES6提供的一種異步編程解決方案,語法行爲與傳統函數徹底不一樣。Generator的中文翻譯是生成器,它是ECMAScript6(代號harmory)中提供的新特性。在過去,封裝一段運算邏輯的單元是函數。函數只存在「沒有被調用」或者「被調用」的狀況,不存在一個函數被執行以後還能暫停的狀況,而Generator的出現讓這種狀況成爲可能。javascript
Generator的定義十分簡單,與普通的函數相比,它只多出一個*號。如下爲簡單例子:java
function *dowork(a) { var sum = yield a + 2; sum = yield a + 4; sum = yield a + 5; } var gen = dowork(10); console.log(gen.next()); ====== { value: 12, done: false }
在dowork函數中經過yield關鍵字讓程序暫停在當前位置,經過generator.next()單步執行,next返回一個對象包括value和done,value爲當前程序的計算結果,而done則表示程序是否執行完成。git
上一級講了promise對象與異步操做,其實在ES6中也能夠用generator來處理異步操做。github
function *doWork() { var url = 'http://www.163.com'; var url1 = 'http://www.sina.com'; var result = yield fetch(url); var result1 = yield fetch(url1); console.log(result1); } var generator = doWork(); var ret = generator.next(); ret.value.then(function (data) { var ret1 = generator.next(data); ret1.value.then(function (data) { generator.next(data); }) });
fetch函數是一個異步執行函數,返回promise對象,整個doWork函數由兩個異步函數構成最後打印其中一個異步函數的結果,因爲每一個next返回的是promise對象所以須要在then中處理數據。編程
generator實現異步可讓代碼變得更線性,可是調用過程仍是比較麻煩的,所以能夠模仿tj大神的co框架(https://github.com/tj/co) 的原理開發一個簡易控制流函數,暫且名字也取爲co。promise
function co(generator) { var gen = generator.next(); var next = function (gen) { if (!gen.done) { if (gen.value instanceof Promise) { gen.value.then(function (data) { next(generator.next(data)); }) } else { next(generator.next(data)); } } } next(gen); } // 執行 co(doWork());
經過co包裝的異步方法能夠很是簡單的執行,編程體驗接近與java。框架