NodeJs——(5)与 events 事件模块

①events模块只提供了一个对象,events.EventEmitter

他的核心是 事件发射 和 事件监听 功能

 

每个事件由一个事件名(用于标识事件),和多个参数组成。

 

事件名:字符串,通常表达一定的语义;

 

事件被发射时,监听该事件的函数被依次调用。

 

 

②调用模块:

var events = require("events");
var emitter = new events.EventEmitter();

事件监听:

emitter.on("/click", function () {
    console.log("first event");
})
emitter.on("/click", function () {
    console.log("second event");
})

事件发射:

emitter.emit("/click");

注意:

【1】/click是事件名(用于标识事件)

【2】可以多个监听,用于监听同一个事件,然后依次执行;

【3】需要先监听,后发射;

【4】监听是on,发射是emit

【5】把emit发射的事件赋值给变量。如果有监听该事件的,则变量值为true,如果无监听该事件,则返回值为false。注意,该变量赋值后不会改变。

即:

var nn = emitter.emit("/click1");
emitter.on("/click1", function () {
    console.log("first event");
})
console.log(nn);

其值nn依然为false。

 

 

③只监听一次:

EventEmitter.once(事件名, 回调函数)

即把上面的on替换为once即可,然后这个只监听一次就失效;

 

 

④移除监听:

EventEmitter.removeListener(事件名, 回调函数名)

注意,这里的关键是:回调函数名,如代码:

 

var events = require("events");
var emitter = new events.EventEmitter();
var first = function () {
    console.log("first event");
}
var second = function () {
    console.log("second event");
}

emitter.on("/click", first)
emitter.on("/click", second)
emitter.emit("/click");
emitter.removeListener("/click", first);
console.log("————移除完成————");
emitter.emit("/click");

输出:

 

⑤全部监听移除:

var events = require("events");
var emitter = new events.EventEmitter();
var first = function () {
    console.log("first event");
}
var second = function () {
    console.log("second event");
}

emitter.on("/click", first)
emitter.on("/click", second)
emitter.emit("/click");
emitter.removeAllListeners("/click");
console.log("————移除完成————");
emitter.emit("/click");

输出:

 

⑥error事件

当遇见异常时会发射error事件,EventEmitter规定,如果没有监听其的监听器,Node.js会把其当成异常,退出程序并打印调用栈。

因此需要设置监听其的监听器,避免遇见错误后整个程序崩溃。

var events = require("events");
var emitter = new events.EventEmitter();
var first = function () {
    console.log("first event");
}
var error = function (error) {
    console.log(error);
}

emitter.on("/click", first)
emitter.on("error", error)  //如果没有这一行代码,下面在发射error时会出错然后退出程序
emitter.emit("/click");
emitter.emit("error", error)
console.log("————移除完成————");
emitter.emit("/click");

输出:

 

但注意:

【1】这个似乎只能对事件的error有效,假如你把发射error事件那行替换为随便几个字母,他依然是会出错然后退出的

【2】注意,error事件不能将console.log替换为error(),会导致直接出错退出

【3】另外,我尝试了用console.log,还有util.inspect方法来显示这个函数内容,可是没成功。

时间: 2025-01-27 16:56:30

NodeJs——(5)与 events 事件模块的相关文章

详解Node.js:events事件模块_node.js

Nodejs的大部分核心API都是基于异步事件驱动设计的,所有可以分发事件的对象都是EventEmitter类的实例. 大家知道,由于nodejs是单线程运行的,所以nodejs需要借助事件轮询,不断去查询事件队列中的事件消息,然后执行该事件对应的回调函数,有点类似windows的消息映射机制.至于更细的实现环节,可以另行查找资料. 下面介绍EventEmitter的使用. 1.监听事件和分发事件 EventEmitter实例可以使用on或addListener监听事件,emit()方法分发事件

跟我学Nodejs(二)--- Node.js事件模块_javascript技巧

简介及资料 http://nodejs.org/api/events.html http://www.infoq.com/cn/articles/tyq-nodejs-event     events是node.js 最重要的模块,events模块只提供了一个对象events.EventEmitter,EventEmitter 的核心是事件发射与事件监听器.     Node.js中大部分的模块,都继承自Event模块.     与DOM树上事件不同,不存在事件冒泡.逐层捕获等行为.     E

Node.js中HTTP模块与事件模块详解_node.js

Node.js的http服务器 通过使用HTTP模块的低级API,Node.js允许我们创建服务器和客户端.刚开始学node的时候,我们都会遇到如下代码: 复制代码 代码如下: var http = require('http'); http.createServer(function (req,res) {     res.end('Hello World\n'); }).listen(3000,"127.0.0.1"); console.log("Server funni

NodeJS学习笔记之Http模块_node.js

一,开篇分析 首先"Http"这个概念大家应该比较熟悉了,它不是基于特定语言的,是一个通用的应用层协议,不同语言有不同的实现细节,但是万变不离其宗,思想是相同的, NodeJS作为一个宿主运行环境,以JavaScript为宿主语言,它也有自己实现的一套标准,这篇文章我们就一起来学习一下 "Http模块" .但是作为前提来说, 希望大家可以先阅读一下官网提供的api,有一个前置了解,这样就方便多了,以下是Http部分的api概览: 复制代码 代码如下: HTTP   

读jQuery之十 事件模块概述_jquery

后面会详细分析jQuery.event.add/jQuery.event.remove/jQuery.event.trigger. 虽然事件模块代码很难读,但其提供的API接口还是很清晰的.如下 1 添加事件(bind/one/live/delegate/hover/toggle) bind 基本的添加事件函数. one 添加只执行一次的事件函数. live 事件代理(使用document代理). delegate 事件代理(使用指定元素代理). hover 模拟css的hover. toggl

Nginx模块参考手册:事件模块(Events Module)

摘要 控制Nginx处理连接的方式 指令 accept_mutex 语法:accept_mutex [ on | off ] 默认值:on Nginx使用连接互斥锁进行顺序的accept()系统调用 accept_mutex_delay 语法:accept_mutex_delay Nms; 默认值:500ms如果一个进程没有互斥锁,它将至少在这个值的时间后被回收,默认是500ms debug_connection 语法:debug_connection [ip | CIDR] 默认值:none

Nodejs实战心得之eventproxy模块控制并发_node.js

目标 建立一个 lesson4 项目,在其中编写代码. 代码的入口是 app.js,当调用 node app.js 时,它会输出 CNode(https://cnodejs.org/ ) 社区首页的所有主题的标题,链接和第一条评论,以 json 的格式. 输出示例: [ { "title": "[公告]发招聘帖的同学留意一下这里", "href": "http://cnodejs.org/topic/541ed2d05e28155f24

Nodejs学习笔记之Stream模块_node.js

一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流是可读,可写或兼具两者的. 最早接触Stream是从早期的unix开始的, 数十年的实践证明Stream 思想可以很简单的开发出一些庞大的系统. 在unix里,Stream是通过 "|" 实现的.在node中,作为内置的stream模块,很多核心模块和三方模块都使用到. 和unix一样,node stream主要的操作也是.pipe(),使用者可以使

Nodejs学习笔记之NET模块_node.js

一,开篇分析 从今天开始,我们来深入具体的模块学习,这篇文章是这个系列文章的第三篇,前两篇主要是以理论为主,相信大家在前两篇的学习中, 对NodeJS也有一个基本的认识,没事!!!趁热打铁,让我们继续将NodeJS进行到底,好了废话不多说,直接进入今天的主题 "Net模块" ,那么"Net"应该如何理解那? 它是做什么用的那?(Net模块可用于创建Socket服务器或Socket客户端.NodeJS 的数据通信,最基础的两个模块是 Net 和 Http,前者是基于