Thunk Generator 小记

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注