揭秘Node.js事件

开发 前端
对于一些简单的程序你可以不使用自定义事件,但这样很难应对复杂的应用。那么如何编写自定义事件?首先需要了解的是在node.js中的’events’模块。

要使用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

【编辑推荐】

  1. Node.js初探之hello world
  2. Node.js初探之与Mysql的交互
  3. Node.js入门之神秘的服务器端JavaScript
  4. 什么是Node.js?
  5. 浅析Node.js:一个“编码就绪”服务器
责任编辑:陈贻新 来源: 移动开发博客
相关推荐

2021-05-27 09:00:00

Node.js开发线程

2024-01-05 08:49:15

Node.js异步编程

2017-08-16 10:36:10

JavaScriptNode.js事件驱动

2013-11-01 09:34:56

Node.js技术

2015-03-10 10:59:18

Node.js开发指南基础介绍

2021-12-18 07:42:15

Ebpf 监控 Node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2011-11-01 10:30:36

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2023-01-31 16:43:31

​Node.js事件循环

2021-12-25 22:29:57

Node.js 微任务处理事件循环

2020-05-29 15:33:28

Node.js框架JavaScript

2015-06-23 15:27:53

HproseNode.js

2012-02-03 09:25:39

Node.js

2021-10-22 08:29:14

JavaScript事件循环

2024-07-08 08:53:52

2020-10-26 08:34:13

Node.jsCORS前端

2021-02-01 15:42:45

Node.jsSQL应用程序
点赞
收藏

51CTO技术栈公众号