摘要:对于一些简单的程序你可以不使用自定义事件,但这样很难应对复杂的应用。那么如何编写自定义事件?首先需要了解的是在Node.js中的’events’模块。希望阅读本篇文章以后大家有所收获,帮助大家对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; 11. }
现在,这个模块已经完成了。我们可以在主程序中使用它。
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”?同时,你也可以看一下我用node.js写的机器人混搭应用(bot mashup)tocho,它使用了ircbot、logger、real-time websockets技术并支持搜索,但是处于开发的前期还比较粗糙。编写这个程序给我带来了很多乐趣。我还没有将搜索功能发布到演示网站,您以使用支持web socket的浏览器访问实时聊天室#node.js。
本文由职坐标整理发布,学习更多的Node.js相关知识,请关注职坐标WEB前端Node.js频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号