From 40b5f23e0bb3f40d45edd0b7bd6b229ac594f140 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 20 May 2016 07:58:21 +0800 Subject: [PATCH] =?UTF-8?q?doc(async):=20Thunk=E5=87=BD=E6=95=B0=E7=9A=84E?= =?UTF-8?q?S6=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/async.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/async.md b/docs/async.md index afca50d..16092c9 100644 --- a/docs/async.md +++ b/docs/async.md @@ -273,6 +273,7 @@ function f(thunk){ ``` 上面代码中,函数f的参数`x + 5`被一个函数替换了。凡是用到原参数的地方,对`Thunk`函数求值即可。 + 这就是Thunk函数的定义,它是"传名调用"的一种实现策略,用来替换某个表达式。 ### JavaScript语言的Thunk函数 @@ -299,6 +300,7 @@ var Thunk = function (fileName){ 任何函数,只要参数有回调函数,就能写成Thunk函数的形式。下面是一个简单的Thunk函数转换器。 ```javascript +// ES5版本 var Thunk = function(fn){ return function (){ var args = Array.prototype.slice.call(arguments); @@ -308,6 +310,15 @@ var Thunk = function(fn){ } }; }; + +// ES6版本 +var Thunk = function(fn) { + return function (...args) { + return function (callback) { + return fn.call(this, ...args, callback); + } + }; +}; ``` 使用上面的转换器,生成`fs.readFile`的Thunk函数。 @@ -317,6 +328,18 @@ var readFileThunk = Thunk(fs.readFile); readFileThunk(fileA)(callback); ``` +下面是另一个完整的例子。 + +```javascript +function f(a, cb) { + cb(a); +} +let ft = Thunk(f); + +let log = console.log.bind(console); +ft(1)(log) // 1 +``` + ### Thunkify模块 生产环境的转换器,建议使用Thunkify模块。