Node.js中处理异步编程(使用回调处理一次性事件,使用事件监听器处理重复性事件)

在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异常参数

  说明:同一目录下的文件更名;

    不同路径下的文件更名 + 移动:(新的路径必须已存在,路径不存在会返回异常)

  

 

  

posted @ 2015-11-02 19:55  小东Blog  阅读(629)  评论(0编辑  收藏  举报