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
随机推荐
- 数据存储之iOS断点续传
iOS里面实现断点续传 第三方框架之AFN 代码实现 一.iOS里面实现断点续传 1⃣️AFN基于NSURL 1.性能和稳定性略差.针对JSON.XML.Plist和Image四种数据结构封装了各自处 ...
- java如何实现多个线程并发运行
随着计算机技术的发展,编程模型也越来越复杂多样化.但多线程编程模型是目前计算机系统架构的最终模型.随着CPU主频的不断攀升,X86架构的硬件已经成为瓶,在这种架构的CPU主频最高为4G.事实上目前3. ...
- asp.net core mvc视频A:笔记3-2.表单使用
页面上呈现表单的两种方式 新建项目,增加Test控制器,增加Index视图 方式一:HTML构建表单 运行 方式二:HTML 运行 数据绑定 处理方法 调用结果 登录后返回值 默认值绑定 方式一: 控 ...
- hdu 1159(Common Subsequence)简单dp,求出最大的公共的字符数
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- Sql效能优化总结(续)- sql语句优化篇
今晚继续进行Sql效能问题的分享,今天主要是一些具体的sql优化方法和思路分享,若看过后你也有其他想法,欢迎一起探讨,好了,进入今天的主题. 针对性地对一些耗资源严重的具体应用进行优化 出现效能问题时 ...
- 【数据挖掘】关联分析之Apriori(转载)
[数据挖掘]关联分析之Apriori 1.Apriori算法 如果一个事务中有X,则该事务中则很有可能有Y,写成关联规则 {X}→{Y} 将这种找出项目之间联系的方法叫做关联分析.关联分析中最有名的问 ...
- Hadoop自带Sort例子分析
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agree ...
- vs2013中opencv的配置
下面开始介绍如何配置,我用的系统是win8.1 64位系统,vs用的是vs3013 ultimate,先到官网下载opencv 我用的的版本是最新的版本3.0 ALPHA,下载下来直接执行即可,实际上 ...
- 【Python+selenium Wendriver API】之下拉框定位
上代码: # coding:utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains impo ...
- JSP 表单处理向服务器提交信息
JSP 表单处理 我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理.浏览器中使用 GET 和 POST 方法向服务器提交数据. GET 方法 GET方法将请求的编码信息添加在网址后面, ...