nodejs模块之event
event模块是nodejs系统中十分重要的一个模块,使用该模块我们可以实现事件的绑定的触发,为什么我们需要这个模块呢,因为nodejs是单线程异步的。
一、什么是单线程异步:
我们可以从JavaScript来理解,就是存在一个等待执行队列,每当有代码行为产生,我们便将其随机放到等待执行队列,但是由于单线程的原因,我们一次只能处理一个任务,只有在当线程空闲时才能处理下一个任务,在线程处理时,我们仍然可以将要处理的任务放到等待执行队列中,也就说线程的任务处理和我们读取代码放任务到等待执行队列上这两个行为是可以同时进行的,即异步,线程一次只能处理一个任务,即单线程。
如下例子:
setTimeout(function (){
console.log('I am coming');
}, 100); console.log('before while');
结果是先打印before while,然后再打印I am coming,而不是在100ms的延时时阻塞之后代码的执行,注册定时器后继续执行之后的代码。
二、event模块的主要方法:
- on:添加事件(事件队列尾部添加)
- once:添加只能触发一次便失效的事件(事件队列尾部添加)
- prependListener:添加事件(添加到事件队列头部)
- prependOnceListener:添加只能触发一次便失效的事件(添加到事件队列头部)
- emit:触发事件
- removeListener:删除某个事件
- on(eventName, listener[, arg1][, arg2]...)
eventName:注册事件名字
listener:事件处理函数
arg1,arg2:往事件处理函数中传入的参数
"use srict"; const Event = require('events'); const event1 = new Event(); event1.on('come', function () {
console.log('I am coming');
}); event1.emit('come'); // I am coming
2. once 同on,但是只能触发一次,触发一次后便从事件队列中删除
3. prependListener 同on,但是是往事件队列头部添加
4. prependOnceListener 同on,但是是往事件队列头部添加,且只能触发一次
5. emit(eventName)触发eventName事件
6. removeListener(eventName)解除eventName事件绑定
同一事件可以绑定多次,触发时按照事件队列顺序执行,on和once是往事件队列尾部添加,prependListener和prependOnceListener是往事件队列头部添加,这便形成了同一事件的执行顺序
"use srict"; const Event = require('events'); const event1 = new Event(); event1.on('come', function () {
console.log('I am coming01');
});
event1.on('come', function () {
console.log('I am coming02');
});
event1.prependListener('come', function () {
console.log('I am coming03');
})
event1.emit('come');
/*
I am coming03
I am coming01
I am coming02
*/
event方法简单模拟实现:
"use strict"; // evnet 实现模拟
EventEmitter.prototype = {
// on方法
on: function(eventName, cb) {
this.events[eventName] = cb;
},
// emit,传参
emit: function(eventName) { const args = Array.prototype.slice.call(arguments, 1);
const cb = this.events[eventName];
cb.apply(this, args);
console.log(this);
}, }
function EventEmitter() {
this.events = {};
} const event1 = new EventEmitter(); event1.on('call', (name, word) => {
console.log('I am calling,', name, word);
});
event1.emit('call', 'john', 'hello'); // I am calling
三、event模块的继承:
event模块可以被其他类继承,从而具有event模块的属性
两种方法:
1、util.inherits
"use srict"; const Event = require('events');
const util = require('util'); // Phone类
Phone.prototype.message = function () {
console.log('I am sending message');
}
function Phone() {}
// 通过util.inherits继承
util.inherits(Phone, Event);
// 测试
const phone = new Phone();
phone.on('call', function () {
this.message();
});
phone.emit('call'); // I am sending message
2、通过ES6的extends实现继承(推荐)
"use srict"; const Event = require('events');
// extends
class Phone extends Event {
message() {
console.log('I am sending message');
}
}
// 测试
const phone = new Phone();
phone.on('call', function () {
this.message();
});
phone.emit('call'); // I am sending message
----------------------------------------------------------------------------------end
nodejs模块之event的更多相关文章
- [NodeJs系列][译]理解NodeJs中的Event Loop、Timers以及process.nextTick()
译者注: 为什么要翻译?其实在翻译这篇文章前,笔者有Google了一下中文翻译,看的不是很明白,所以才有自己翻译的打算,当然能力有限,文中或有错漏,欢迎指正. 文末会有几个小问题,大家不妨一起思考一下 ...
- nodejs nodejs模块使用及简单的示例
nodejs模块使用及简单的示例 参考菜鸟教程网:http://www.runoob.com/ 一.fs模块的使用: 1.文件操作: 读文件: //读文件 var fs=require('fs'); ...
- 不要在nodejs中阻塞event loop
目录 简介 event loop和worker pool event loop和worker pool中的queue 阻塞event loop event loop的时间复杂度 Event Loop中 ...
- NodeJS 模块开发及发布详解
NodeJS 是一门年轻的语言,扩展模块并不太全,经常我们想用某个模块但是却找不到合适的.比如前两天我需要使用hmac和sha1来做签名,就没有找到一个比较好用的模块,这时候就需要我们自己来实现相应的 ...
- NodeJS模块、包、NPM
1.NodeJS模块 每一个Nodejs都是一个NodeJS模块,包括JS文件,JSON文本文件,二进制模块文件. a.模块的应用 新建一个文件mytest. ...
- # nodejs模块学习: express 解析
# nodejs模块学习: express 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创造大量的轮子 ...
- nodejs模块xml2js解析xml的坑
在一个项目中,用到nodejs模块xml2js解析xml,xml的数据如下: <xml> <MsgId>6197906553041859764</MsgId> &l ...
- NodeJS 模块&函数
NodeJS 模块&函数 nodejs的多文件操作通过模块系统实现,模块和文件一一对应.文件本身可以是javascript代码.JSON或编译过的C/C++扩展 基本用法 nodeJS通过ex ...
- es6模块 nodejs模块和 typescript模块
es6模块 import和export nodejs模块 require和module.exports typescript模块 module和export
随机推荐
- 按“开始”-“运行”,或按WIN+R,在[运行]窗口中输入
command--------CMD命令提示符 ipconfig查看本机IP chkdsk.exe-----Chkdsk磁盘检查 certmgr.msc----证书管理实用程序 calc--- ...
- HTTP图解--了解Web及网络基础
1.网络基础TCP/IP 通常使用的网络是在TCP/IP协议族的基础上运行的,http属于它内部的一个子集. TCP/IP协议族按层次分别分为:应用层.传输层.网络层和数据链路层.分层的好处在于各司其 ...
- Ubuntu16.04 打开txt文件乱码
最近遇到个小问题:Ubuntu16.04下打开txt出现乱码,倒腾下解决了这个问题,记录下来. Ubuntu16.04 默认已经安装gedit.直接双击被打开的文件默认用gedit打开,显然这种方式行 ...
- sql自定义函数及C#中调用
1.在C#中调用sql自定义函数 1.1 标量值函数 sql语句调用 select dbo.GetClassIDWithName(1) string strSql = string.Format(& ...
- Qemu事件处理机制简介
Qmeu 采用了基于事件驱动的架构,所有的事件都在一个事件循环(event loop)中被处理,系统中默认的事件循环是在main-loop.c 中的主循环(main loop).我们也可以使用 –ob ...
- 详解zabbix安装部署(Server端篇) (转)
Linux下常用的系统监控软件有Nagios.Cacti.Zabbix.Monit等,这些开源的软件,可以帮助我们更好的管理机器,在第一时间内发现,并警告系统维护人员. 今天开始研究下Zabbix,使 ...
- URL重写:Rewirte模块原理详解
Apache+PHP+MySQL Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等.本文将针对mod_ ...
- Winform 动态 画图 不闪
一.问题:解决winform动态画图闪的问题,网上搜的方法,大部分都是: “this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlSty ...
- MHA常用命令
.查看ssh登陆是否成功 masterha_check_ssh --conf=/etc/masterha/app1.cnf .查看复制是否建立好 masterha_check_repl --conf= ...
- NFS网络文件系统服务(配置实战)
NFS网络文件系统服务(实战) NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.让不同的主机系统(NFS的客户端)可以透明地读写位 ...