EventEmitter:nodeJs事件触发机制
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列
Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例
NodeJs事件监听触发机制依赖 events 核心模块,
events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装
我们来看看它的基本用法
const EventEmitter = require('events').EventEmitter
//实例化EventEmitter类
const event = new EventEmitter()
//error是特殊事件,系统自动触发,如果程序没有设置监听器的话,系统遇到错误会抛出,终止代码运行
event.on('error', err => {
console.log(err)
})
//添加事件监听
event.on('init', () => {
console.log(`初始化...`)
})
//可以给一个事件设设置多个监听器
event.on('data', reciveData)
event.on('data', processData)
//默认最多为一个事件设置10个监听器,可以通过以下方法修改
// event.setMaxListeners(11)
event.on('close', () => {
console.log(`结束..`)
})
//移除监听器
event.removeListener('data',reciveData)
function reciveData(data){
console.log(`收到数据: ${data}`)
}
function processData(data){
console.log(`处理数据: ${data}`)
}
event.emit('init')
setTimeout(()=>{
//触发事件,如果事件没被监听返回 false
event.emit('data','ABCDEFG')
},1000)
setTimeout(()=>{
//触发事件
event.emit('close')
},2000)
以上代码介绍了eventEmitter的全部用法,可能我们会问这个eventEmitter有什么卵用吗?
大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它
例如我们常用的方法 http.get 方法,该方法传入两个参数
参数1:需要请求url
参数2:http.IncomingMessage实例,而这个对象正是继承 eventEmitter 对象
下面代码大概模拟了了http.get工作原理
const EventEmitter = require('events').EventEmitter
var myHttp = {}
myHttp.incomingMessage = function(statusCode, headers){
this.statusCode = statusCode
this.headers = headers
}
myHttp.incomingMessage.prototype = new EventEmitter()
myHttp.get = function(url, fn){
//伪代码:获取url内容
var im = new this.incomingMessage(200,{'content-type': 'json/application'})
fn(im)
im.emit('data',`来自${url}的数据`)
}
module.exports = myHttp
使用
const myHttp = require('./event.js')
myHttp.get('http://www.baidu.com', res => {
console.log(res)
res.on('data', data => {
console.log(data)
})
})
EventEmitter:nodeJs事件触发机制的更多相关文章
- 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”
回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...
- C#事件触发机制
C#的事件触发机制,类似于c++的回调函数机制 我先简单说一下,委托和事件的实质,后期再重开一篇博文来详细说 委托:指向方法的指针,类似于C的函数指针 事件:是一个可以存放0个或多个方法指针的数据结构 ...
- [转载] 理解 epoll 的事件触发机制
原文: http://weibo.com/p/1001603862394207076573?sudaref=weibo.com epoll的I/O事件触发方式有两种模式:ET(Edge Trigger ...
- html元素双击事件触发机制猜想及疑惑
今天有个同事遇到一个奇怪的问题,我照着他的代码做了一些简化写了这个demo <!DOCTYPE html> <html> <head> <style type ...
- WinForm中的事件触发机制学习
在一个Form窗体中拖个按钮,双击后系统自动生成代码: private void button1_Click(object sender, EventArgs e) { } 同时在窗体的Initial ...
- 初探nodejs事件循环机制event loop
nodejs的特点 nodejs 具有事件驱动和非阻塞I/O的特点. 事件驱动是指nodejs把每一个任务当成事件来处理. 非阻塞I/O是指nodejs遇到I/O任务时,会从线程池调度单独的线程处理I ...
- Yii中事件触发机制
控制器初始化中添加事件处理方法,在需要触发的地方直接触发 public function init() { parent::init(); // TODO: Change the autogenera ...
- python 模拟事件触发机制
EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading impor ...
- 基于raw os 的事件触发系统
Raw os的事件触发系统有以下特点: 1 基于UML的状态机理念设计,实现了有限状态机(fsm)以及层次状态机(HSM). 2 实现了活动对象(ACTIVE OBJECT)的特性,一个活动对象包含了 ...
随机推荐
- pip install torch on windows, and the 'from torch._C import * ImportError: DLL load failed:' solution
通过pip安装PyTorch 0.4.0成功(cpu, not gpu; python3.5; pip): pip3 install http://download.pytorch.org/whl/c ...
- React 组件间通信介绍
React 组件间通信方式简介 React 组件间通信主要分为以下四种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面对这四种情况分别进行介绍: 父组件向子 ...
- [JAVA]字节数组流
import java.io.*; public class ByteArrayStream { public static void main(String[] args) { byte[] dat ...
- python requests 请求禁用SSL警告信息解决
Python3 requests模块发送HTTPS请求,关闭SSL 验证,控制台会输出以下错误: InsecureRequestWarning: Unverified HTTPS request is ...
- html限制文本框只能输入数字和一个小数点
近期在做一个前台页面,有一个文本框是用来输入充值金额的,就想到了限制用户只能输入纯数字的数据且只能包含一个小数点.下面就是我实现的代码 $(function() { //阻止数字键以外的按键输入 $( ...
- vue 深拷贝
Vue.set(row,'isEdit',true); let newRow = JSON.parse(JSON.stringify(row)); this.totalData.push(newRow ...
- 用openssl为WEB服务器生成证书(自签名CA证书,服务器证书)
用openssl为WEB服务器生成证书(自签名CA证书,服务器证书) 来源: https://www.cnblogs.com/osnosn/p/10608455.html 来自osnosn的博客 写于 ...
- webRTC中音频相关的netEQ(五):DSP处理
上篇(webRTC中音频相关的netEQ(四):控制命令决策)讲了MCU模块是怎么根据网络延时.抖动缓冲延时和反馈报告等来决定给DSP模块发什么控制命令的.DSP模块根据收到的命令进行相关处理,处理简 ...
- navigateTo、redirectTo、switchTap与reLaunch的区别
wx.navigateTo:保留当前页,跳转到指定页,非tabBar:使用 wx.navigateBack 可以返回到当前的页面. wx.redirectTo:关闭当前页,跳转到指定页,非tabBar ...
- html字体加粗标签与写法
在html中字体加粗的标签为<b>标签,当我们使用了该标签,字体就会加粗,一般用于注明重要信息,强调文字上面写法如下 字体加粗:<b>这里的字体就会加粗</b> 效 ...