{ 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