在Node.js中,流行两种响应逻辑管理方式:回调和事件监听;
一般用回调来处理一次性事件,使用事件监听器处理处理重复性事件;
回调是一个函数,它被当做参数传给异步函数,它描述了一步操作完成之后要做什么。
例一:使用回调处理一次性事件,实现如下功能:
(1)异步获取存放在JSON文件中的文章标题;
(2)异步获取简单的HTML模板;
(3)把那些标题组装到HTML页面里;
(4)把HTML页面发送给用户;
在同一个目录下,创建三个文件,分别为:titles.json,template.html ,blog_recent.js
titles.json中的代码内容为:
[
"This is the first Title",
"This is the second Title",
"This is the third Title"
]
template.html中的代码内容为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用回调触发一次性事件</title>
</head>
<body>
<h1>Latest Posts</h1>
<ul><li>%</li></ul>
</body>
</html>
blog_recent.js中的代码内容为:
var http=require(‘http‘);
var fs=require(‘fs‘);
http.createServer(function(req,res){
if(req.url==‘/‘){
fs.readFile(‘./titles.json‘, function(err,data){
if(err){
console.error(err);
res.end(‘Server Error‘);
}
else{
var titles=JSON.parse(data.toString());
fs.readFile(‘./template.html‘, function(err,data){
if(err){
console.error(err);
res.end(‘Server Error‘);
}
else{
var tmpl=data.toString();
var html=tmpl.replace(‘%‘,titles.join(‘</li><li>‘));
res.writeHead(200,{‘Content-Type‘:‘text/html‘});
res.end(html);
}
});
}
});
}
}).listen(8011,"127.0.0.1");
在操作系统环境下运行node blog_recent.js ,在浏览器中输入http://localhost:8011
例二:使用事件监听处理重复性事件,
在另一目录下新建一个文件watcher.js,新建两个文件夹,分别重命名为watch和done
watcher.js文件的内容代码为:
function Watcher(watchDir,processedDir){
this.watchDir=watchDir;
this.processedDir=processedDir;
}
var events=require(‘events‘)
, util=require(‘util‘);
util.inherits(Watcher,events.EventEmitter);
Watcher.prototype=new events.EventEmitter();
var fs=require(‘fs‘), watchDir=‘./watch‘, processedDir=‘./done‘;
Watcher.prototype.watch=function(){
var watcher=this;
fs.readdir(this.watchDir,function(err,files){
if(err) throw err;
for(var index in files){
watcher.emit(‘process‘,files[index]);
}
})
}
Watcher.prototype.start=function(){
var watcher=this;
fs.watchFile(watchDir,function(){
watcher.watch();
});
}
var watcher=new Watcher(watchDir,processedDir);
watcher.on(‘process‘,function process(file){
var watchFile=this.watchDir+‘/‘+file;
var processedFile=this.processedDir+‘/‘+file.toLowerCase();
fs.rename(watchFile,processedFile,function(err){
if(err) throw err;
});
});
watcher.start();
在系统环境下运行 node watcher.js
运行效果:将文件名称为大写的文件拷贝到watch文件夹下,会看到文件出现在done目录下,文件名会被改成小写。
引申:
(1)关于util模块:这里只简单介绍util.inherits()
util.inherits(Sub, Base)是一个实现对象间原型继承 的函数。
JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同。JavaScript 没有 提供对象继承的语言级别特性,而是通过原型复制来实现的。
我们定义了一个基础对象Base 和一个继承自Base 的Sub,这里Sub只继承Base原型上的属性和方法;详细见:http://www.runoob.com/nodejs/nodejs-util.html
(2)关于fs.rename(oldPath, newPath, [callback(err)]),修改文件名称,可更改文件的存放路径。
由于该方法属于fs模块,使用前需要引入fs模块(var fs= require(“fs”) )
接收参数:
oldPath 原路径
newPath 新路径
callback 回调,传递一个err异常参数
说明:同一目录下的文件更名;
不同路径下的文件更名 + 移动:(新的路径必须已存在,路径不存在会返回异常)
Node.js中处理异步编程(使用回调处理一次性事件,使用事件监听器处理重复性事件)
原文:http://www.cnblogs.com/xiaodongaini/p/4931111.html