node的 thunkify模块说明
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模块说明的更多相关文章
- node之path模块
node之path模块 原文链接 //引用该模块 var path = require("path"); 1.路径解析,得到规范化的路径格式 对window系统,目录分隔为'', ...
- 运用node的文件系统模块批量修改文件名
如果我们需要大批量修改一个文件中的名称,比如,删除文件名中的副本时,就可以借助node的文件系统模块,快捷快速的完成. 首先建立一个js文件(changeName.js),代码如下: // 引入f ...
- thunkify 模块
function thunkify(fn){ assert('function' == typeof fn, 'function required'); return function(){ var ...
- Node.js的模块载入方式与机制
Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始 ...
- Node.js Web模块
什么是Web服务器? Web服务器是处理由HTTP客户端发送的,如web浏览器的HTTP请求的软件应用程序,并返回响应于客户端网页. Web服务器通常伴随着图片,样式表和脚本的HTML文档. 大多数W ...
- Node.js工具模块
在Node.js的模块库中提供实用的模块数量. 这些模块都是很常见的,并同时开发基于任何节点的应用程序频繁使用. S.N. 模块的名称和说明 1 OS Module提供基本的操作系统相关的实用功能 2 ...
- node.js基础模块http、网页分析工具cherrio实现爬虫
node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言 说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherri ...
- Node.js:模块
概要:本篇博客主要介绍node.js的模块 1.创建模块 在node.js中创建一个模块非常简单,因为一个文件就是一个模块.我们只需要明白如何从其他文件中获取这个模块.Node.js提供了 expor ...
- node.js之模块
node.js之模块 1.自定义模块的设置 加载自定义模块利用require: eg: require('./custom_module.js') 2.从模块外部访问模块内的成员 2.1使用expor ...
随机推荐
- jquery的$().each,$.each的区别
在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法.两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. $().each,对于这个方法,在d ...
- 视觉机器学习------K-means算法
K-means(K均值)是基于数据划分的无监督聚类算法. 一.基本原理 聚类算法可以理解为无监督的分类方法,即样本集预先不知所属类别或标签,需要根据样本之间的距离或相似程度自动进行分类.聚 ...
- iOS基于MVC的项目重构总结
关于MVC的争论 关于MVC的争论已经有很多,对此我的观点是:对于iOS开发中的绝大部分场景来说,MVC本身是没有问题的,你认为的MVC的问题,一定是你自己理解的问题(资深架构师请自动忽略本文). 行 ...
- C++:C++的两种多态形式
// // main.cpp // Test.cpp // // Created by mac on 15/8/11. // Copyright (c) 2015年. All rights reser ...
- linux io stack
- Python 面向对象(初级篇)
51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后 ...
- 让div支持placeholder属性/模拟输入框的placeholder属性
实现方式:css div:empty:before{ content: attr(placeholder); color:#bbb;}div:focus:before{ content:none; }
- GCD的简单用法
/* 创建一个队列用来执行任务,TA属于系统预定义的并行队列即全局队列,目前系统预定义了四个不同运行优先级的全局队列,我们可以通过dispatch_get_global_queue来获取它们 四种优先 ...
- python之面向对象编程
1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...
- Leetcode: Sentence Screen Fitting
Given a rows x cols screen and a sentence represented by a list of words, find how many times the gi ...