Node入门教程(10)第八章:Node 的事件处理
Node中大量运用了事件回调,所以Node对事件做了单独的封装。所有能触发事件的对象都是 EventEmitter
类的实例,所以上一篇我们提到的文件操作的可读流、可写流等都是继承了 EventEmitter
。当然我们也可以自定义具有事件行为的自定义对象,仅需要对其继承即可。
继承EventEmitter
node的events
模块封装了EventEmitter
类型,此类型里面封装了事件注册、触发等API。
// 引入events模块
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {
constructor(opt) {
super(opt);
}
}
// 创建事件对象实例。
const myEmitter = new MyEmitter();
// 注册event事件,event是事件名字,最好符合以驼峰命名规范。
myEmitter.on('event', () => {
console.log('触发了一个事件!');
});
// 触发event事件
myEmitter.emit('event');
给回调函数传递参数
emit()
方法触发事件的同时,还可以给回调函数传递参数。
// 引入events模块
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {
constructor(opt) {
super(opt);
}
}
// 创建事件对象实例。
const myEmitter = new MyEmitter();
// 注册event事件,event是事件名字,最好符合以驼峰命名规范。
myEmitter.on('event', (a, b) => {
console.log('event: %s, %s', a, b);
});
// 触发event事件,并传递参数a、b
myEmitter.emit('event', 'aicoder.com', '全栈实习');
错误处理的约定
当 EventEmitter 实例中发生错误时,会触发一个 'error' 事件。 这在 Node.js 中是特殊情况。
如果 EventEmitter 没有为 'error' 事件注册至少一个监听器,则当 'error' 事件触发时,会抛出错误、打印堆栈跟踪、且退出 Node.js 进程。
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!'));
// 抛出错误,并使 Node.js 崩溃
为了防止 Node.js 进程崩溃,可以在 process
对象的 uncaughtException
事件上注册监听器.
const myEmitter = new MyEmitter();
// 给nodejs的进程增加未捕获异常的处理,防止程序崩溃
process.on('uncaughtException', (err) => {
console.error('有错误');
});
myEmitter.emit('error', new Error('whoops!'));
// 打印: 有错误
只处理事件一次
on()
方法可以注册事件处理程序,而且是每次emit()
触发事件,都会被执行。但是用once()
注册的事件,仅执行一次。例如:
// 引入events模块
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {
constructor(opt) {
super(opt);
}
}
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.once('event', () => {
console.log(++m);
});
myEmitter.emit('event');
// 打印: 1
myEmitter.emit('event');
// 忽略
实战案例
做一个应用时,我们需要在应用启动之前或者启动之后,给其他的开发人员提供一些可以注册处理程序的钩子,可以用事件的方式实现。其实本质就是发布订阅模式。
'use strict';
const EventEmitter = require('events');
class Application extends EventEmitter {
constructor(opt) {
super(opt);
this.on('error', err => {
console.log('应用程序出错了!');
});
}
init() {
// 触发预初始化事件
this.emit('preInit');
// ... 默认的初始化代码
// 初始化事件
this.emit('init');
}
start() {
// 初始化服务器
this.init();
}
}
/**/
var app = new Application();
app.on('init', () => {
console.log('初始化!');
});
app.on('preInit', () => {
console.log('pre init');
});
app.start();
总结
Node中的事件处理封装很简单易用,跟jQuery的事件系统非常类似。其实自己实现一套事件系统也不难,核心思想就是:发布订阅(观察者)模式。
Node入门教程(10)第八章:Node 的事件处理的更多相关文章
- Linux pwn入门教程(10)——针对函数重定位流程的几种攻击
作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...
- ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区 1 学习资源 用户在学习和应用过程中,可以参考的资源如下: 1. ...
- D3.js的v5版本入门教程(第八章)—— 坐标轴
D3.js的v5版本入门教程(第八章) D3中没有现成的坐标轴图形,需要我们自己用其他组件拼凑而成.D3中提供了坐标轴组件,使得我们在SVG中绘制一个坐标轴变得像添加一个普通元素那样简单 为了表绘制一 ...
- Node入门教程(2)第一章:NodeJS 概述
Node 概述 什么是 Node Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- Node入门教程(1)目录
aicoder.com 全栈实习之简明 Node 入门文档 aicoder.com 线下实习: 不 8000 就业,不还实习费. 如果需要转载本文档,请联系老马,Q: 515154084 JS基础教程 ...
- Node入门教程(8)第六章:path 模块详解
path 模块详解 path 模块提供了一些工具函数,用于处理文件与目录的路径.由于windows和其他系统之间路径不统一,path模块还专门做了相关处理,屏蔽了彼此之间的差异. 可移植操作系统接口( ...
- 《Node入门》读书笔记——用Node.js开发一个小应用
Android APP的开发告一段落,一个稳定的.实现了基本功能的APP已经交付用户使用了!我和老板交流了下,接下来准备转战Node.js了,而且一部分前端的功能也要做进去!哈哈哈~~~接下来要朝一个 ...
- ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门
一.前言 1.本教程主要内容 ASP.NET Core + 内置日志组件记录控制台日志 ASP.NET Core + NLog 按天记录本地日志 ASP.NET Core + NLog 将日志按自定义 ...
- ABP入门教程10 - 展示层实现增删改查-控制器
点这里进入ABP入门教程目录 创建控制器 在展示层(即JD.CRS.Web.Mvc)的Controllers下新建一个控制器CourseController.cs using Abp.Applicat ...
随机推荐
- 计蒜客-跳跃游戏二 (简单dp)
题目链接:https://nanti.jisuanke.com/t/20 跳跃游戏二 给定一个非负整数数组,假定你的初始 ...
- go语言爬虫 - TapTap用户都喜欢些什么游戏
前面的废话 说到爬虫,首先想到的当然是python~ 它在机器学习.爬虫数据分析领域可谓是如日中天,十分热门.但我最近在学习go语言,所以就用go写了 TapTap社区 这是一个高品质的游戏分享社区, ...
- 蓝牙扫描工具btscanner修复暴力扫描模式
蓝牙扫描工具btscanner修复暴力扫描模式 在btscanner 2.1-5版本中,当用户按下快捷键b,执行暴力扫描模式,会出现程序奔溃问题.该问题现在已经修复.用户只需要更新系统,将btsc ...
- 添加js,css 版本号?v= hash
node_modules设置 a.打开 node_modules\gulp-rev\index.js 第144行 manifest[originalFile] = revisionedFile; 更新 ...
- android studio 汉化 svn插件汉化。布局文件 属性 汉化 public.xml
android studio 汉化 SvnBundle.properties D:\Android Studio\plugins\svn4idea\lib resources_en.jar\org\j ...
- 安卓工作室Android Studio 快捷键
安卓工作室Android Studio 快捷键 Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O ...
- POJ.1655 Balancing Act POJ.3107 Godfather(树的重心)
关于树的重心:百度百科 有关博客:http://blog.csdn.net/acdreamers/article/details/16905653 1.Balancing Act To POJ.165 ...
- 【WIN32编程】利用汇编写cs1.6辅助
这篇文章本来在2018.5.1号就写完发圈子去了,这两天跟朋友在网吧打单击才想起来,就顺便把内容发上去把 作者:admin-神风 用CE找到功能的地址 CS1.6下载地址:https://pan.ba ...
- treap(树堆)
一棵treap是一棵修改了结点顺序的二叉查找树,如图,显示一个例子,通常树内的每个结点x都有一个关键字值key[x],另外,还要为结点分配priority[x],它是一个独立选取的随机数. 假设所有的 ...
- null与“ ”
http://blog.csdn.net/eroswang/article/details/8529817 MySQL数据库是一个基于结构化数据的开源数据库.SQL语句是mysql数据库中核心语言.不 ...