Thunk函数和Generator函数

Thunk

Thunk用于传名调用,即把参数放进一个临时函数中,再将这个临时函数传入函数体。

function (m){
return m * 2;
}

f(x + 5);


var thunk = function () {
return x + 5;
};
function main(thunk){
return thunk() * 2;
}

x是参数,将其放进临时函数中,真正用需要的时候才调用,传入main函数中,典型的函数式编程思想。

在 JS 中,Thunk 函数替换的不是表达式,而是多参数函数,将其替换成单参数的版本,且只接受回调函数作为参数,实质是函数的柯里化

function Thunk(fn){
return function (){
//闭包保存函数的参数
var args = Array.prototype.slice.call(arguments);
//返回一个函数,参数只有callback
return function (callback){
//参数列表增加回调函数
args.push(callback);
return fn.apply(this, args);
}
};
};

仅仅是Thunk并没有多大用处,需要结合Generator进行流程管理。

Generator

生成器函数,返回一个迭代器Iterator对象,我们可以通过这个迭代器,手动地遍历相关的值、状态,保证正确的执行顺序。生成器函数有next方法。

通过next函数,可以执行对应的yield表达式,且next()函数还可以带参数,该参数可以作为上一次yield表达式的返回值,因为yield本身是没有返回值的,如果next()中不带参数,则yield每次运行之后的返回值都是为undefined

function* gen() {
// ...
}

var g = gen();
var res = g.next();

while(!res.done){
console.log(res.value);
res = g.next();
}
//执行next会返回{value: "one", done: false}

Generator函 大专栏  Thunk函数和Generator函数数只是返回一个指针,指向里面迭代的对象,一般情况下,需要我们主动触发next()来执行,所以仅仅只有Generator并不适合进行异步操作。

yield关键字使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
yield关键字实际返回一个IteratorResult对象,它有两个属性,valuedonevalue属性是对yield表达式求值的结果,而donefalse,表示生成器函数尚未完全完成。

如果将可选值传递给生成器的next()方法,则该值将成为生成器当前yield操作返回的值

Thunk 函数的自动流程管理

Thunk 函数真正的威力,在于可以自动执行 Generator 函数

function run(fn) {
var gen = fn();

function next(err, data) {
var result = gen.next(data);/*将指针移动到Generator函数的下一步*/
if (result.done) return;/*判断是否结束*/
result.value(next);/*递归,把next放进.value中*/
//经过thunk的函数,参数只有callback,这里就是next函数!!,
}

next();
}

var g = function* (){
var f1 = yield readFile('fileA');
var f2 = yield readFile('fileB');
// ...
var fn = yield readFile('fileN');
};

run(g);

next 函数先将指针移到 Generator 函数的下一步(gen.next 方法),然后判断 Generator 函数是否结束(result.done 属性),如果没结束,就将 next 函数再传入 Thunk 函数(result.value 属性),否则就直接退出


猜你喜欢

转载自www.cnblogs.com/wangziqiang123/p/11691158.html
今日推荐