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