最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态。比如Node中的模块,平时练习就接触到那么几个,其他的一些模块暂时只会在学习的时候接触到,不常用便就荒废了。正所谓好记心不如烂笔头,多做笔记还是更有利于理解和记忆。自己做的总结也方便回头复习,所以决定踏上漫长的修炼之旅……

Node提供了许多API,其中一些比较重要。这些核心的API是所有Node应用的支柱,你会不停的用到他们。

Events

几乎所有的模块都是建立在Event模块的基础上诞生的,而Event模块只提供了一个对象:events.EventEmitter,其核心功能就是事件发射和事件监听功能的封装。

EventEmitter

Node创建了一个EventEmitter类提供基础的事件功能,所有的Node的事件功能都围绕着EventEmitter,因为它的设计包含了其他类拓展所需要的接口类。EventEmitter的每一个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。每一个事件都支持若干个事件监听器。当事件发射时,注册的事件监听器一次被调用,同时参数作为回调函数的参数传递要注意,通常不会直接调用EventEmitter对象,我们可以通过 require('events').EventEmitter 获取 EventEmitter 类。

EventEmitter提供了一系列的方法,最主要的两个方法是onemit,这些方法供其它类使用。

使用on方法监听事件

on方法接受两个参数:需要监听的事件的名称和事件触发时需要调用的函数。因为EventEmitter是接口,所以从EventEmitter继承的类需要用new关键字来构造。

//创建一个新的类支持EventEmitter事件
var util = require("util"),
EventEmitter = require("events").EventEmitter; var Server = function(){
console.log("init");
}; util.inherits(Server, EventEmitter); var s = new Server(); s.on("eventName", function(){
console.log("eventName : abc");
});

在这个例子中,我们先包含了util模块。以便调用它的inherits方法。inherits能够将EventEmitter类的方法添加到创建的Server类中(有关utils模块的介绍日后补上),也就是说这样一来所有的Server的新实例都能够使用EventEmitter的方法。然后我们包含了Events模块。但是我们只是想调用其中的EventEmitter类,然后将它的方法绑定到要用的Server类上。

Server的实例能够访问EventEmitter的方法,也就是说我们可以调用on方法为这个实例添加事件监听器。到目前为止,我们添加的事件监听器还不会被调用,因为并没有一个叫做“eventName”的事件被触发。

使用emit方法触发事件

s.emit("eventName",a,b,c);

触发事件监听器很简单,只要调用emit方法就可以了。要注意的是,这些事件只是针对某一个实例的,并不存在全局的事件。但你调用on方法的时候,需要将其绑定在特定的基于EventEmitter的对象上(继承自EventEmitter的对象)。

调用emit方法时,除了第一个参数是事件的名称外,你可以传入任意数目的参数。这些参数都将传递给该监听事件的函数。比如从HTTP服务器接收到request请求的时候,你会接受到两个参数:req和res。当request事件被触发时,这些参数会作为第二个和第三个参数传给emit函数。

回调函数

前面说到的,当事件触发时,emit方法中的第二个参数之后的所有参数都会传递给on方法中的回调函数。那前面的例子来说,emit方法中的参数a,b,c将会作为参数传递给on方法中的毁掉函数

emitter 中的内容:

 // write by 张小伦爱学习

var util = require("util"),
EventEmitter = require("events").EventEmitter; var Server = function(){
console.log("init");
}; util.inherits(Server, EventEmitter); var s = new Server(); s.on("eventName", function(para1,para2,para3){
console.log("eventName : abc");
console.log("para1 : "+para1);
console.log("para2 : "+para2);
console.log("para3 : "+para3);
}); s.emit("eventName","a","b","c");

输出结果

init                //创建一个Server实例
eventName : abc //on方法中的回调函数
para1 : a
para2 : b
para3 : c

更多方法

emitter.once(event, listener)

添加一个 一次性监听器,这个监听器只会在下一次事件发生时被触发一次,触发完成后就被删除。

emitter.addListener(event, listener)

添加一个监听器至特定事件的监听器数组尾部,和on方法一样,但是on方法没有与之对应的removeListener方法。

emitter.removeListener(event, listener)

从一个事件的监听器数组中删除一个监听器注意:此操作会改变监听器 数组中当前监听器后的所有 监听器在的下标。

关于addListener和removeListener,可以结合一下DOM中的addEventListener和removeEventListener方法来理解。

更多详细的介绍请看这里

结束语

最近在github上fork了若干个国外的开源项目,比较小巧的项目。但是遇到了障碍,语言不通啊!!!!!!英语太菜啊!!!!!!光看得懂文档有毛线用啊!!!!!要理解思维方式啊!!!

默默努力吧,加油!

笔记-Nodejs中的核心API之Events的更多相关文章

  1. hibernate系列笔记(2)---Hibernate的核心API

    Hibernate的核心API 一般我们通过hibernate进行操作的时候,都会遵循下面的流程,那么接下来我对每一个步骤进行讲解: 1 public void testInsert() { 2 // ...

  2. 笔记-Node.js中的核心API之HTTP

    最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态.比如Node中的模块,平时练习就接触到那么几个,其他的 ...

  3. 不要在nodejs中阻塞event loop

    目录 简介 event loop和worker pool event loop和worker pool中的queue 阻塞event loop event loop的时间复杂度 Event Loop中 ...

  4. 通读cheerio API ——NodeJs中的jquery

    通读cheerio API ——NodeJs中的jquery 所谓工欲善其事,必先利其器,所以通读了cheerio的API,顺便翻译了一遍,有些地方因为知道的比较少,不知道什么意思,保留了英文,希望各 ...

  5. Node.js学习笔记(二) --- CommonJs和Nodejs 中自定义模块

    一. 什么是 CommonJs? JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器. 然而, JavaScript标准定义的 API 是为了构建基于浏览器的应用程序.并没有制定一 ...

  6. JAVA微服务应用(1)--SpringBoot中的REST API调用(学习笔记)

    好长时间没有写学习小结了,最近宁正好看了小马哥的微服务系列之<Spring Boot>系列,颇有收获,并且公司也布置一个课题就是关于Spring中的REST API调用.于是乎回归本行,再 ...

  7. 【前端学习笔记】2015-09-09~~~~nodejs中的require()和module.exports

    nodejs中一个js文件就可以看做是一个模块 在node环境中,可以直接var a=require('模块路径以及不带扩展名的模块名') exports---module.exports 其中nod ...

  8. nodejs中异步

    nodejs中的异步 1 nodejs 中的异步存在吗? 现在有点 javascript 基础的人都在听说过 nodejs ,而只要与 javascript 打交到人都会用或者是将要使用 nodejs ...

  9. nodeJS中的事件机制

    events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http.fs等.本文将详细介绍nodeJS中的事件机制 EventEmitter 多数 Node.js ...

随机推荐

  1. verilog 随笔

    不是说你在代码里定义一个reg型变量,综合器就会综合处一个寄存器来,case必须在always块里,always里面的被赋值变量必须是reg型,这是语法的规定,只能遵守.写代码的时候不要加入触发器(不 ...

  2. WPF的重要新概念

    原文 http://www.cnblogs.com/free722/archive/2011/11/12/2238654.html 逻辑树与可视树 XAML天生就是用来呈现用户界面的,这是由于它具有层 ...

  3. HDU 5716 带可选字符的多字符串匹配(ShiftAnd)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5716 [题目大意] 给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串 ...

  4. 解决ArcSDE图层名被占用的问题

    点击文章查看 当你发现上面那篇文章时你已经接近成功了,但还差最后一步! <!- -delete   from sde.GDB_OBJECTCLASSES where NAME = upper(' ...

  5. 数据结构中La表的数据合并到Lb表中

    实验描述:La表中的数据为(3,5,8,11)  Lb 表中的数据为(2,6,8,9,11,15,20) 将La表中的数据而不存在Lb表的数据插入到Lb表中,从而实现并集操作. 出现的问题:最后实现的 ...

  6. Ubuntu下用glade和GTK+开发C语言界面程序(三)——学习make的使用方法

    makefile的规则 makefile的规则例如以下: target ... : prerequisites ... command ... ... target能够是一个object file(目 ...

  7. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  8. c# 针对不同数据库进行参数化查询

    使用参数化 DbCommand 的一个缺点是需要参数的代码将仅适用于支持相同语法的提供程序.OLEDB.SqlClient 和 Oracle 提供程序全部使用不同的语法.例如,用于命名和指定参数的 S ...

  9. angular的那些事

    angular.js是什么 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTM ...

  10. 虚拟键盘,移动web开发的痛

    原生APP的弹出虚拟键盘和收回虚拟键盘,输入框始终贴在虚拟键盘的上方.如下图: 如果移动端web也想做类似的功能,可以实现吗?  你可能会说着:“不就是放一个position: fixed;的输入框在 ...