zoukankan      html  css  js  c++  java
  • 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异常参数

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

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

      

      

  • 相关阅读:
    【UR #17】滑稽树前做游戏
    chage
    [SDOI2016]储能表——数位DP
    password
    groupdel
    [NOI2017]泳池——概率DP+线性递推
    groupadd
    CF986C AND Graph
    userdel
    CF986C AND Graph
  • 原文地址:https://www.cnblogs.com/xiaodongaini/p/4931111.html
Copyright © 2011-2022 走看看