揭秘Node.js事件


要使用NodeJS,你需要知道一个重要的东西:事件(events)。Node中有很多对象都可以触发事件,Node的文档中有很多示例。但文档也许并不能清晰的讲解如何编写自定义事件以及监听函数。对于一些简单的程序你可以不使用自定义事件,但这样很难应对复杂的应用。那么如何编写自定义事件?首先需要了解的是在node.js中的’events’模块。


快速概览


要访问此模块,只需使用如下语句:


require(‘events’)


requires(‘events’).EventEmitter


特别说明,node中所有能触发事件的对象基本上都是后者的实例。让我们创建一个简单的演示程序Dummy:


dummy.js


  1. // basic imports  
  2. var events = require('events');  
  3.  
  4. // for us to do a require later  
  5. module.exports = Dummy;  
  6.  
  7. function Dummy() {  
  8.     events.EventEmitter.call(this);  
  9. }  
  10.  
  11. // inherit events.EventEmitter  
  12. Dummy.super_ = events.EventEmitter;  
  13. Dummy.prototype = Object.create(events.EventEmitter.prototype, {  
  14.     constructor: {  
  15.         value: Dummy,  
  16.         enumerable: false 
  17.     }  
  18. }); 

上述代码中重点展示如何使用EventEmitter扩充对象,并从中继承所有的原型对象,方法…等等。


现在,我们假设Dummy有一个cooking()的方法,一旦把食物做熟之后它会触发’cooked’事件,并调用一个名为’eat’的回调函数。


dummy-cooking.js


  1. Dummy.prototype.cooking = function(chicken) {  
  2.     var self = this;  
  3.     self.chicken = chicken;  
  4.     self.cook = cook(); // assume dummy function that'll do the cooking  
  5.     self.cook(chicken, function(cooked_chicken) {  
  6.         self.chicken = cooked_chicken;  
  7.         self.emit('cooked', self.chicken);  
  8.     });  
  9.  
  10.     return self;  

现在,这个模块已经完成了。我们可以在主程序中使用它。


dummy-node.js


  1. // A nonsensical node.js program  
  2.  
  3. var Dummy = require('./dummy');  
  4. var kenny = new Dummy();  
  5. var dinner = kenny.cooking(fried_chix);  
  6. dinner.on('cooked'function(chicken) {  
  7.     // eat up!  
  8. }> 

所以基本上,node.js执行脚本,然后等待’cooked’事件被触发,并在事件触发之后调用回调函数并传递返回的参数。


还有什么要注意的


值得注意的是,例子中使用的“子类”和事件有一些极端(a bit of an overkill)。EventEmitter每次只触发一个事件(EventEmitter for things that only fire one event once)。如果只创造少数几个实例,可以将方法直接加入到实例本身,如果要触发底层事件,可能实用异步函数会更好一些。


关于events.EventEmitter,你还需注意一个特别的事件:’error’。任何错误发生时此事件都会触发,并且当没有监听程序监听这个事件时,node将会抛出异常并结束应用程序。(感谢Tim指出这一点)


结束之前的话


这篇文章简要介绍了一些好的方法(good runthrough)。在发表之前文章之前,我查阅了我最喜爱的图书馆,参考别人的实现,并且还得到了别人的帮助弄把一些问题搞清楚。为了更好的理解node,我建议你阅读Time Caswell的文章:


What is “this”? http://howtonode.org/what-is-this


同时,你也可以看一下我用node.js写的机器人混搭应用(bot mashup)tocho,它使用了ircbot、logger、real-time websockets技术并支持搜索,但是处于开发的前期还比较粗糙。编写这个程序给我带来了很多乐趣。我还没有将搜索功能发布到演示网站,您以使用支持web socket的浏览器访问实时聊天室#node.js。


原文:http://www.grati.org/?p=318




标签:

友情链接
轻松育儿世界奇观
苏ICP备16066217号-2