thunkify这种函数其实就是python的decorator方式,对目标方法进行一步步的wrap,但是这种方式和generator结合起来就会威力无穷了,实现自动异步功能。

thunkify使用一般分为三步,这里以fs.readFile这个非阻塞函数为例.

1.用thunkify  wrap要调用的目标函数,这里是fs.readFile。

2.wrap目标函数 的普通参数,这里就是fs.readFile的文件名称

3.wrap目标函数 操作结束时的毁掉函数,这里是fs.readFile的 callback参数

node.js中的非阻塞api调用都是这个路子,如fs.readFile(fileName,callback);

thunkify注解

第一步:fn为fs.readFile
function thunkify(fn){
assert('function' == typeof fn, 'function required');

第二部:arguments为fs.readFile(filename,callback)的文件名称:filename
return function(){
var args = new Array(arguments.length);
var ctx = this; for(var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}

第三步:done为fs.readLine(filename,callback)中的callback
return function(done){
var called; args.push(function(){
if (called) return;
called = true;
done.apply(null, arguments);
}); try {
fn.apply(ctx, args);
} catch (err) {
done(err);
}
}
}
};

fs.readFile借用thunkify:

1.var readFile=thunkify(fs.readFile)

2.var fn=readFile('filename') 到此结束,还没真正开始调用系统api,一切都只是处于闭包缓存状态

3.fn(function callback(err,data){}) 到这里才开始真正的开始调用os api 读取文件数据了。

下面是从es 6 标准入门的一个例子改过来的:thunkif和generator 配合,自动完成非阻塞的读取文件。

var thunkify=require('thunkify');
var fs=require('fs');
var readFile=thunkify(fs.readFile); var generator=function* (){
for(var i=0;i<arguments.length;i++){
console.log('file: %s',arguments[i]);
var r1=yield readFile(arguments[i]); //yield thunkify 最内部的 function (done){} 函数
console.log('r1: %s',r1);
}
} function rungenerator(generator){
//文件名称
var args=[];
for(var i=1;i<arguments.length;i++){
args.push(arguments[i]);
}
//生成generator实例
var gen= generator.apply(null,args);
function next(err,data){
if(data){
console.log('data:',data.toString());
}
//执行跳到 generator中去
var result=gen.next('abc');
if(result.done) {return;}
//console.log('result: %s',result.value);
result.value(next);//真正的调用,next作为回调
}
next();
} rungenerator(generator,'1.js','2.js','3,js')

另外:python和javascript中的generator的差别还是很大的,python中的generator是个跛脚的东西,generator不能嵌套调用,没有实现彻底的实现,导致它的执行路线只能被封闭在同一个generator中。js中没有这个问题。

node的 thunkify模块说明的更多相关文章

  1. node之path模块

    node之path模块 原文链接 //引用该模块 var path = require("path"); 1.路径解析,得到规范化的路径格式 对window系统,目录分隔为'', ...

  2. 运用node的文件系统模块批量修改文件名

      如果我们需要大批量修改一个文件中的名称,比如,删除文件名中的副本时,就可以借助node的文件系统模块,快捷快速的完成. 首先建立一个js文件(changeName.js),代码如下: // 引入f ...

  3. thunkify 模块

    function thunkify(fn){ assert('function' == typeof fn, 'function required'); return function(){ var ...

  4. Node.js的模块载入方式与机制

    Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始 ...

  5. Node.js Web模块

    什么是Web服务器? Web服务器是处理由HTTP客户端发送的,如web浏览器的HTTP请求的软件应用程序,并返回响应于客户端网页. Web服务器通常伴随着图片,样式表和脚本的HTML文档. 大多数W ...

  6. Node.js工具模块

    在Node.js的模块库中提供实用的模块数量. 这些模块都是很常见的,并同时开发基于任何节点的应用程序频繁使用. S.N. 模块的名称和说明 1 OS Module提供基本的操作系统相关的实用功能 2 ...

  7. node.js基础模块http、网页分析工具cherrio实现爬虫

    node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言      说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherri ...

  8. Node.js:模块

    概要:本篇博客主要介绍node.js的模块 1.创建模块 在node.js中创建一个模块非常简单,因为一个文件就是一个模块.我们只需要明白如何从其他文件中获取这个模块.Node.js提供了 expor ...

  9. node.js之模块

    node.js之模块 1.自定义模块的设置 加载自定义模块利用require: eg: require('./custom_module.js') 2.从模块外部访问模块内的成员 2.1使用expor ...

随机推荐

  1. 使用struts的logic:iterate标签遍历列表时得到显示序号

    <logic:notEmpty name="sList" scope="request"> <logic:iterate id="e ...

  2. telnet输入乱码的解决

    1.Win+R --- 运行窗口  输入cmd回车 2.输入telnet 主机 端口 3.连接主机发现无法输入 4.这里什么也不要输入,按下 ctrl+] 键 5.按下回车键,然后会弹出新的窗口,就可 ...

  3. 可爱的Python_课后习题_CDay−3 通过函式进行功能化

    1. 读取某一简单索引文件cdays−3-test.txt,其每行格式为:文档序号关键词,现须根据这些信息将它转化为倒排索引,即统计关键词在哪些文档中,格式如下:包含该关键词的文档数关键词 => ...

  4. WIN8,开机启动 需要管理员权限的程序

    1. 用WPF开发,需要管理员权限并开机启动,以写注册表的方式实现.仅写注册表只能启动一般权限的程序. 2. 考虑这样实现: 程序以一般权限启动,启动以后申请管理员权限. 实现: App类中重写OnS ...

  5. js判断手机 横屏模式

    js判断手机 横屏模式 方法名称:orientation 实例: if(window.orientation!=0){ var obj=document.getElementById('orienta ...

  6. 只需三步--轻松反编译Android Apk文件

    安卓程序是通过java语言进行编写的,可以很容易进行反编译.很多apk文件被反编译后再二次打包,就成了自己的产品,很是流氓.下面我们来看看如何进行apk的反编译,以及常用的防反编译手段. 一.反编译A ...

  7. 做个体面有尊严的IT人【转自界面】

    向老罗致敬,好人终有好报: 转自网站:界面-http://www.jiemian.com/article/231843.html [华盛顿] 史蒂夫·马奎斯隐居在华盛顿郊外的一栋小木屋里,没有电视.没 ...

  8. javascript获取当前url

    在WEB开发中,许多开发者都比较喜欢使用javascript来获取当前url网址,本文就此为大家总结一下比较常用获取URL的javascript实现代码,以下示例是前面为相应实现方法,后面是获取URL ...

  9. mongodb学习(一)

    操作系统环境:ubuntu. 安装mongodb:apt-get install mongodb 安装后运行:mongod提示:[initandlisten] exception in initAnd ...

  10. Linux Bond的原理及其不足

    http://www.tektea.com/archives/1969.html. 在企业及电信Linux服务器环境上,网络配置都会使用Bonding技术做网口硬件层面的冗余,防止单个网口应用的单点故 ...