Skip to content

Instantly share code, notes, and snippets.

@fwon
Last active March 24, 2016 08:12
Show Gist options
  • Save fwon/01c29a60116924e98fd6 to your computer and use it in GitHub Desktop.
Save fwon/01c29a60116924e98fd6 to your computer and use it in GitHub Desktop.
thunk的概念和用法
/*
参考链接 http://www.ruanyifeng.com/blog/2015/05/thunk.html
js中 thunk 的概念及函数式编程中所说的柯里化
JavaScript 语言是传值调用,它的 Thunk 函数含义有所不同。在 JavaScript 语言中,Thunk 函数替换的不是表达式,而是多参数函数,将其替换成单参数的版本,且只接受回调函数作为参数
*/
/*例子一*/
// 正常版本的readFile(多参数版本)
fs.readFile(fileName, callback);
// Thunk版本的readFile(单参数版本)
var readFileThunk = Thunk(fileName);
readFileThunk(callback);
var Thunk = function (fileName){
return function (callback){
return fs.readFile(fileName, callback);
};
};
/*例子二*/
var Thunk = function(fn){
return function (){
var args = Array.prototype.slice.call(arguments);
return function (callback){
args.push(callback);
return fn.apply(this, args);
}
};
};
var readFileThunk = Thunk(fs.readFile);
readFileThunk(fileA)(callback);
//表面看上去没什么大作用,实际上在ES6 有了 Generator 函数,Thunk 函数现在可以用于 Generator 函数的自动流程管理。
/*一般回调方式的Generator函数*/
var fs = require('fs');
var thunkify = require('thunkify');
var readFile = thunkify(fs.readFile);
var gen = function* (){
var r1 = yield readFile('/etc/fstab');
console.log(r1.toString());
var r2 = yield readFile('/etc/shells');
console.log(r2.toString());
};
var g = gen();
var r1 = g.next();
r1.value(function(err, data){
if (err) throw err;
var r2 = g.next(data);
r2.value(function(err, data){
if (err) throw err;
g.next(data);
});
});
/*实现自动流程管理的Generator函数*/
function run(fn) {
var gen = fn();
function next(err, data) { //callback有回调参数
var result = gen.next(data);
if (result.done) return;
result.value(next); //获取function(callback){}, callback为next
}
next();
}
var gen = function* (){
var f1 = yield readFile('fileA'); //每个yeild实际返回一个function(callback){}
var f2 = yield readFile('fileB');
// ...
var fn = yield readFile('fileN');
};
run(gen);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment