在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异常参数
说明:同一目录下的文件更名;
不同路径下的文件更名 + 移动:(新的路径必须已存在,路径不存在会返回异常)