{ value: x, done: true/false }
, 若是done
爲true
,則value
就是return的返回值,沒有return就返回undefined,若是return語句後面還有yield,這個generator對象就所有執行完成,不要再繼續調用next()
了for ... of
循環迭代generator對象,這種方式不須要咱們本身判斷done
for (var x of fib(5)) { console.log(x); // 依次輸出0, 1, 1, 2, 3 }
function* foo(x) { var y = 2 * (yield (x + 1)); var z = yield (y / 3); return (x + y + z); } var a = foo(5); a.next() // Object{value:6, done:false} a.next() // Object{value:NaN, done:false} a.next() // Object{value:NaN, done:true} var b = foo(5); b.next() // { value:6, done:false } b.next(12) // { value:8, done:false } b.next(13) // { value:42, done:true }
function* main() { var result = yield request("http://www.filltext.com?rows=10&f={firstName}"); console.log(result); //do 別的ajax請求; }
co 模塊的思路就是利用 generator 的這個特性,將異步操做跟在 yield 後面,當異步操做完成並返回結果後,再觸發下一次 next() 。固然,跟在 yield 後面的異步操做須要遵循必定的規範 thunks 和 promises。javascript
function co(gen) { var it = gen(); var ret = it.next(); ret.value.then(function(res) { it.next(res); }); } function sayhello() { return Promise.resolve('hello').then(function(hello) { console.log(hello); }); } co(function *helloworld() { yield sayhello(); console.log('world'); });
優勢:線性邏輯,經過中間件形式把業務邏輯細分、簡化,一個請求進來通過一系列中間件處理後再響應給用戶,清晰明瞭。
缺點:基於 callback 組合業務邏輯,業務邏輯複雜時嵌套過多,異常捕獲困難。java
優勢:首先,藉助 co 和 generator,很好地解決了異步流程控制和異常捕獲問題。其次,Koa 把 Express 中內置的 router、view 等功能都移除了,使得框架自己更輕量。
缺點:社區相對較小。ajax