// Thunkify 源码
function thunkify(fn) {
return function() {
var args = new Array(arguments.length);
var ctx = this;
for (var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}
// yield 执行完后实际上返回的是一个function
return function (done) {
var called;
// 增加回调方法
args.push(function () {
if (called) return;
called = true;
// timeout计时结束后调用value传进来的方法
done.apply(null, arguments);
});
try {
// 执行最开始的读文件的方法
fn.apply(ctx, args);
} catch (err) {
done(err);
}
}
}
};
var readFile = function (name, callback) {
setTimeout(() => callback(null, name), 1000);
}
var readFileThunk = thunkify(readFile);
var gen = function* (){
var t1 = yield readFileThunk('test1');
console.log(t1.toString());
var t2 = yield readFileThunk('test2');
console.log(t2.toString());
}
//var g = gen();
//var r1 = g.next();
var run = function (fn) {
var g = fn();
var next = function (err, data) {
// 一个操作结束的回调
var result = g.next(data);
if (result.done) return;
// value是一个function
// 执行这个value方法,并且传入一个next方法
result.value(next);
}
next();
}
run(gen);