co函数和thunk函数作用都是让Generator函数自动执行,无需用户手动调用next方法
var gen = function* (){var f1 = yield readFile('/etc/fstab');var f2 = yield readFile('/etc/shells');console.log(f1.toString());console.log(f2.toString());};
co函数可以让你不用编写Generator函数的执行器
var co = require('co')co(gen).then(() => {console.log("Generator函数执行")})
co函数前提条件:Generator函数的yield命令后面,只能是Thunk函数或者Promise对象。
thunk函数用的比较少,这里省略。主要看基于Promise对象的自动执行器。
基于Promise对象的自动执行
下面对fs.readFile进行Promise封装
var fs = require('fs')var readFile = function (fileName) {return new Promise((resolve, reject) => {fs.readFile(fileName, (error, data) => {if (error) reject(error);reject(data)})})}var gen = function* () {var f1 = yield readFile('/etc/fstab');var f2 = yield readFile('/etc/shells');console.log(f1.toString());console.log(f2.toString());}
手动执行
对于f1、f2 两行的手动操作,readFile是一个promise对象,所以可以通过then方法,直接拿到读取文件成功的回调,这时将成功的value赋值给f1,作为下一个next方法的参数
var g = gen()g.next().value.then(data => {g.next(data).value.then(data => {g.next(data).value.then...})})
自动执行
对于操作较少的generator函数,手动执行看起来很方便,但面对函数多的情况,还一个个手动执行就很费力;下面是自动执行的方法
function autoRun(gen) {var g = gen();function next(data) {var result = g.next(data);if (result.done) return result.value;result.value.then(data => {next(data);});}next();}autoRun(gen);
