揭秘Node.js事件

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

创新互联长期为千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为千山企业提供专业的网站设计制作、成都网站设计,千山网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。

快速概览

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

require(‘events’)

requires(‘events’).EventEmitter

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

dummy.js

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

上述代码中重点展示如何使用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.     return self;
  10. }

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

dummy-node.js

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

所以基本上,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

当前标题:揭秘Node.js事件
分享链接:http://www.mswzjz.cn/qtweb/news23/535473.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能