generator函数是ES6提供的异步编程解决方案。
自动执行异步方法:thunk和promise
thunk函数
thunk函数: 只接受一个函数作为参数的函数。
可以将带有回调函数的多参函数转化为thunk函数。
const fs = require('fs');
//将函数转化为thunk函数
function thunk(fn) {
return function(...args) {
return function(callback) {
fn.call(this, ...args, callback);
}
}
}
var readFile = thunk(fs.readFile);
//同步书写方式
function* gen() {
var f1 = yield readFile('./a.txt'); //thunk 函数
var f2 = yield readFile('./b.txt');
console.log(f1.toString());
console.log(f2.toString());
}
function run(fn) {
var g = fn();
function next(err, data) {
var result = g.next(data);
if(result.done) return;
result.value(next);//执行异步操作
}
next();
}
run(gen);
promise
使用promise实例
var fs = require('fs');
var readFile = function (fileName) {
return new Promise(function (resolve, reject) {
fs.readFile(fileName, function(error, data) {
if (error) reject(error);
resolve(data);
});
});
};
var gen = function* () {
var f1 = yield readFile('./a.txt');
var f2 = yield readFile('./b.txt');
console.log(f1.toString());
console.log(f2.toString());
};
function run(fn) {
var g = fn();
function next(data) {
var result = g.next(data);
if(result.done) return;
result.value.then(next);
}
next();
}
run(gen);