要使用NodeJS,你需要知道一个重要的东西:事件(events)。Node中有很多对象都可以触发事件,Node的文档中有很多示例。但文档也许并不能清晰的讲解如何编写自定义事件以及监听函数。对于一些简单的程序你可以不使用自定义事件,但这样很难应对复杂的应用。那么如何编写自定义事件?首先需要了解的是在node.js中的’events’模块。
快速概览
要访问此模块,只需使用如下语句:
require(‘events’)
requires(‘events’).EventEmitter
特别说明,node中所有能触发事件的对象基本上都是后者的实例。让我们创建一个简单的演示程序Dummy:
dummy.js
- // basic imports
- var events = require('events');
- // for us to do a require later
- module.exports = Dummy;
- function Dummy() {
- events.EventEmitter.call(this);
- }
- // inherit events.EventEmitter
- Dummy.super_ = events.EventEmitter;
- Dummy.prototype = Object.create(events.EventEmitter.prototype, {
- constructor: {
- value: Dummy,
- enumerable: false
- }
- });
上述代码中重点展示如何使用EventEmitter扩充对象,并从中继承所有的原型对象,方法…等等。
现在,我们假设Dummy有一个cooking()的方法,一旦把食物做熟之后它会触发’cooked’事件,并调用一个名为’eat’的回调函数。
dummy-cooking.js
- Dummy.prototype.cooking = function(chicken) {
- var self = this;
- self.chicken = chicken;
- self.cook = cook(); // assume dummy function that'll do the cooking
- self.cook(chicken, function(cooked_chicken) {
- self.chicken = cooked_chicken;
- self.emit('cooked', self.chicken);
- });
- return self;
- }
现在,这个模块已经完成了。我们可以在主程序中使用它。
dummy-node.js
- // A nonsensical node.js program
- var Dummy = require('./dummy');
- var kenny = new Dummy();
- var dinner = kenny.cooking(fried_chix);
- dinner.on('cooked', function(chicken) {
- // eat up!
- }>
所以基本上,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
【编辑推荐】