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
随机推荐
- 超高逼格Log日志打印
代码地址如下:http://www.demodashi.com/demo/12646.html 前言 Log日志的打印一直是一个比较头疼的事,怎样才能让自己的log显示更多信息,怎样才能让自己的log ...
- 《TCP/IP具体解释卷2:实现》笔记--IP的分片和重装
IP首部内有三个字段实现分片和重装:标识字段(ip_id).标志字段(ip_off的3个高位比特)和偏移字段(ip_off的13个低位 比特).标志字段由3个1bit标志组成.比特0是保留的必须为0, ...
- fabric自动发布tomcat线上项目
现在公司的每个tomcat项目都有测试和生产两个环境,对于经常需要上线的tomcat项目,如用手工更新就非常耗费时间和人力.现用fabric开发了一个自动发布tomcat项目的脚本,该脚本已经在公司使 ...
- zabbix监控xenserver
xenserver是基于redhat的,可以在zabbix官网下载对应的redhat zabbix安装包,直接安装即可 http://repo.zabbix.com/zabbix/3.0/rhel/5 ...
- pods 遇到的问题
解决方法 : product -> sccheme ->pod 点击
- Spring Cloud Zuul 网关的分布式系统中整合Swagger(转)和 zuul跨域访问问题
首先恭喜自己终于找对了努力的方向,很荣幸能在公司接触到微服务架构,也很高兴公司一个大佬哥们愿意带我,他技术确实很牛逼,我也很佩服他,前后端通吃,干了六年能有这样的水平.最近跟着在搞微服务架构,给我分配 ...
- synchronized 锁优化
synchronized 在jdk 1.7之前是重量级锁,独占锁,非公平锁.jdk1.7之后,synchronized引入了 偏向锁,自旋锁,轻量级锁,重量级锁 自旋锁 当线程在获取锁的时候,如果发现 ...
- git学习之简介(一)
一.前言 史上最浅显易懂的Git教程! 为什么要编写这个教程?因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得 ...
- ubuntu防火墙 ufw配置
https://www.cnblogs.com/ylan2009/articles/2321136.html
- C#中Dictionary的作用及用法讲解
Dictionary<string, string>是一个泛型 他本身有集合的功能有时候可以把它看成数组 他的结构是这样的:Dictionary<[key], [value]> ...