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);