Last active
March 24, 2016 08:12
-
-
Save fwon/01c29a60116924e98fd6 to your computer and use it in GitHub Desktop.
thunk的概念和用法
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
参考链接 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