设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

Node.js设计经验谈

2014-9-25 11:24| 发布者: joejoe0332| 查看: 3891| 评论: 0|原作者: 伍昆|来自: CSDN

摘要: Node.js作为一门新兴的后台语言,旨在帮助程序员快速构建可伸缩的应用程序。Node.js有很多吸引人的地方,有关它的报道不计其数,本文将针对EventEmitter、Streams、Coding Style、Linting、Coding Style等特性进行分 ...

  Node.js作为一门新兴的后台语言,旨在帮助程序员快速构建可伸缩的应用程序。Node.js有很多吸引人的地方,有关它的报道不计其数,本文将针对EventEmitter、Streams、Coding Style、Linting、Coding Style等特性进行分析探讨,帮助用户对Node.js有更深入的了解。




  作为一个基于Chrome JavaScript 运行时建立的平台,我们对JavaScript 的相关认识,似乎都可应用于node应用程序之上;无需额外的语言扩展或修饰,我们便可以把前端编程的经验应用于后端编程。


EventEmitter(事件发送器)

  首先应该先了解EventEmitter模型。它可以发送一个事件以及让消费者订阅感兴趣的事件。我们可以把它看成是向一个异步函数进行回调传递模式的扩展。特别是,当需要进行多次回调时,EventEmitter会更显优势。

  例如,有一个调用者向远程服务器发送了一个“列出文件”的请求。你可能想对返回结果进行分组,对每一个分组进行一次回调处理。EventEmitter模型可以让你在每一个分组上发送“文件”回调,当全部操作完成时进行“结束”处理。

  使用EventEmitter时,只需设置好相关事件和参数。

  1. var EventEmitter = require('events').EventEmitter;  
  2. var util = require('util');  
  3.   
  4. function MyClass() {  
  5.   if (!(this instanceof MyClass)) return new MyClass();  
  6.   
  7.   EventEmitter.call(this);  
  8.   
  9.   var self = this;  
  10.   setTimeout(function timeoutCb() {  
  11.     self.emit('myEvent''hello world', 42);  
  12.   }, 1000);  
  13. }  
  14. util.inherits(MyClass, EventEmitter);  


  MyClass构造函数创建了一个时间触发器,触发延时为1s,触发事件为myEvent。要使用相关事件,需要执行on()方法:

  1. var myObj = new MyClass();  
  2. var start = Date.now();  
  3. myObj.on('myEvent'function myEventCb(str, num) {  
  4.   console.log('myEvent triggered', str, num, Date.now() - start);  
  5. });  


  这里要注意的是,订阅的EventEmitter事件虽然是异步事件,但当时间触发时,监听方的动作是会同步的。因此如果上述myEvent事件有10个监听者,所有的监听会被按次序调用而不用等候事件的循环。


  如果EventEmitter的一个子类生成了一个emit(‘error’)事件,但是无任何的监听方对此进行订阅,那么EventEmitter基类会抛出一个异常,从而导致当执行process对象时触发uncaughtException事件。


verror

  verror是基类Error的扩展,可以让我们使用printf字符格式定义输出消息。


Streams()

  如果有一个非常庞大的文件需要处理,理想的方法应该是读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成,这里就需要用到流的概念。Streams是Node中另一个广泛使用的模型,在Node中是EventEmitter的实现。提供了可读、可写或者是全双工接口。它是一个抽象接口,提供的常规操作事件包括:readable、writable、 drain、data、 end及close。如果我们能够使用pipeline(管道)来对这些事件进行有效整合,将可实现功能更强大的交互操作。

  透过使用.pipe(),可以让Note通过pipeline与back-pressure进行通信。back-pressure的意思是:只读取那些能够写入的,或只写入那些能够读取的。

  例如我们现在把来自stdin的数据发送到一个本地文件和远程服务器:

  1. var fs = require('fs');  
  2. var net = require('net');  
  3.   
  4. var localFile = fs.createWriteStream('localFile.tmp');  
  5.   
  6. net.connect('255.255.255.255', 12345, function(client) {  
  7.   process.stdin.pipe(client);  
  8.   process.stdin.pipe(localFile);  
  9. });  


  而如果我们想发送数据到一个本地文件,并想使用gunzip对这个stream进行压缩,可以这样做:

  1. var fs = require('fs');  
  2. var zlib = require('zlib');  
  3.   
  4. process.stdin.pipe(zlib.createGunzip()).pipe(fs.createWriteStream('localFile.tar'));  


  如果想对stream有更多了解,请点击这里



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部