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。框架