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:删除某个事件
  1. 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 coming03I am coming01I 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

转载于:https://www.cnblogs.com/Walker-lyl/p/7249477.html

nodejs模块之event相关推荐

  1. 基于源码剖析nodejs模块系统

    nodejs模块系统 简介 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之, 一个 No ...

  2. nodeJS学习(9)--- nodeJS模块:exports vs module.exports

    模块简介: 通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ 这些核心模块被编译成二进制文件,可以 require('模块名') ...

  3. 通过 Browserify 在浏览器中使用 NodeJS 模块

    NodeJS 把 JavaScript 的使用从浏览器端扩展到了服务器端,使得前端开发人员可以用熟悉的语言编写服务器端代码.这一变化使得 NodeJS 很快就流行起来.在 NodeJS 社区中有非常多 ...

  4. 不要在nodejs中阻塞event loop

    文章目录 简介 event loop和worker pool event loop和worker pool中的queue 阻塞event loop event loop的时间复杂度 Event Loo ...

  5. nodejs模块加载分析(1).md

    前言 上篇 nodejs 启动流程分析中,遗留了几个问题.这一篇,主要讲讲模块加载流程.大家都应该熟悉 timer 模块的相关功能.我们就以 timer 为引子,一步步看下去吧. C++ init 方 ...

  6. Nodejs模块、自定义模块、CommonJs的概念和使用

    场景 CommonJs JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器.然而, JavaScript 标准定义的API 是为了构建基于浏览器的应用程序.并没有制定一个用于更广泛 ...

  7. NodeJS——模块全局安装路径配置以及关于supervisor的问题解释

    下载安装NodeJS后,在自己选择的路径下会有如下的文件: 默认情况下NodeJS安装会同时安装npm(模块管理器:用于管理用户require的模块,有全局和本地两种). 注:全局:执行npm  in ...

  8. Nodejs模块初始化

    模块初始化 一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象.之后,缓存起来的导出对象被重复利用. 主模块 通过命令行参数传递给NodeJS以启动程序的模块被称为 ...

  9. 常用的NodeJS模块

    图片处理 1.Manipulate images 官网:http://github.com/aheckmann/gm ImageMagick和GraphicsMagick主要用于图片的创建.编辑.合成 ...

最新文章

  1. 规范的 Commit Message
  2. c# 关闭软件 进程 杀死进程
  3. 2020年python工资一般多少钱-2020年Python发展前景如何呢?
  4. python numpy矩阵索引_Numpy中的矩阵索引
  5. [one day one question] express 不缓存如何实现
  6. 子主题function php,php – 带有依赖项的子主题
  7. C语言结构体内存对齐问题
  8. 如何做到免驱打印_创想三维:3D打印机制造光感护眼台灯
  9. ORACLE表空间查看和扩展
  10. 网络管理之SNMP协议
  11. 【程序猿助手】Emacs,最强的编辑器,之间的不
  12. 可用等式为:html+java=jsp表示jsp[8]._在 JSP 中 , 对 jsp:setProperty 标记描述正确的是 ()_学小易找答案...
  13. 用户注册页面的再次确认密码的验证方式
  14. 使用ASP.NET快速开发平台,获得表单源码,用珍藏资料换来的代码生成器!
  15. 泰坦尼克号沉没之谜,用数据还原真相——Titanic获救率分析(用pyecharts)
  16. msf生成win版免杀木马
  17. vue获取上一个页面路由
  18. 机器学习之逻辑回归(对数几率回归)
  19. Java学习---Day16_IO流基础篇
  20. Navicat的安装及简单使用

热门文章

  1. 植物病害分类的深度可解释体系结构(github源码)
  2. aes256 php,如何在PHP中进行AES256解密?
  3. php cookie注销,注销后未设置php cookie
  4. java判断jd安装,java - 安装和使用 java 反编译应用: jd-compiler ,以及命令行的使用...
  5. vs2017修改服务器地址大全,vs2017更改默认pip安装服务器地址
  6. php用字母数字生成用户名,请问生成字母加数字
  7. elasticsearch docker无法挂载_Docker 容器监控方案怎么选?看看这套开源方案
  8. VS2012下基于Glut OpenGL GL_POLYGON示例程序:
  9. mysql到底可不可以使用join_《Mysql 到底可不可以使用 Join ?》
  10. 金蝶eas怎么引出凭证_金蝶EAS该如何导出凭证