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
随机推荐
- DirectorySearcher LDAP
1.从LDAP服务器上面获取用户名 sAMAccountName是个人的CN结点中的一个属性,例如个人的CN的sAMAccountName的值为:Amy.我命名它为shortname,即短名 publ ...
- Ansible@一个高效的配置管理工具--Ansible configure management--翻译(五)
无书面许可请勿转载 高级Playbook Extra variables You may have seen in our template example in the previous chapt ...
- HUAWEI HiAI亮相Droidcon柏林2018开发者峰会 开启HiAI海外生态
柏林时间6月25日到27日,华为HiAI亮相Droidcon柏林2018开发者峰会,有1200多位海外开发者参加了此次峰会,来自HUAWEI HiAI领域的多名专家携手Prisma和金山WPS,以“E ...
- IOS开发中的分享到邮件
本篇和UIWebView的全屏截图,可以一起使用,先对UIWebView进行截图,然后分享到邮箱(当时做还有分享到微信.腾讯微博.新浪微博功能,这三个根据官方资料,比较容易实现,这里就不进行解说了). ...
- C# .Net 下 x86使用大内存的处理
/LARGEADDRESSAWARE 选项通知链接器应用程序可处理大于 2 GB 的地址. 在 64 位编译器中,默认情况下启用此选项. 在 32 位编译器中,如果未在链接器行上指定 /LARGEAD ...
- 转载 【iOS开发】网页JS与OC交互(JavaScriptCore) OC ----->JS
目标 本文介绍利用苹果在iOS7时发布的JavaScriptCore.framework框架进行js与OC的交互.我们想要达到的目标是: OC调用网页上的js方法 网页js调用APP中的OC方法 ...
- PHP-Manual的学习----【语言参考】----【类型】-----【NULL】
2017年8月24日11:34:061.特殊的 NULL 值表示一个变量没有值.NULL 类型唯一可能的值就是 NULL. 2.在下列情况下一个变量被认为是 NULL: ◦ 被赋值为 NULL. ◦ ...
- cocos2d-x 3.0rc1 使用iconv库 解决UTF8乱码问题
多国语言要用到开源字符转换 iconv 先贴出自己的使用代码 你能够做成头文件 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include &qu ...
- IOS中UITableView异步加载图片的实现
本文转载至 http://blog.csdn.net/enuola/article/details/8639404 最近做一个项目,需要用到UITableView异步加载图片的例子,看到网上有一个E ...
- 服务器端获取表单数据的编码解码问题(servlet)
首先需要明确指出的是,这里的服务器是指tomcat. 在页面没有明确指定编码的情况下,客户端通过input标签和字符串向服务器传递两个值param1和param2.如果直接使用request.getP ...