nodejs Events -https://nodejs.org/api/events.html
2017-10-12 19:34
447 查看
NODE的事件机制
许多Nodejs的核心API构建在一个异步事件驱动架构上,此架构上有很多周期性发射事件的对象(被称为事件发射器),发射出的事件会导致相应的函数对象(称为事件监听者)被调用。例如,一个
net.Server对象,每次有同伴连接它时,它就会发射一个事件。一个
fs.ReadStream对象会在某个文件被打开时发射一个事件,一个 stream 对象会在数据可读时发射一个事件。
所有发射事件的对象都是
EventEmitter类的实例,这些对象有一个eventEmitter.on()方法,此方法允许将一个或者多个函数附着在对象发射的事件上。一般来说,事件名一般为驼峰命名的字符串,但是,任何合法的js属性key都可以作为事件名。
当
EventEmitter对象发射一个事件时,附着在事件之上的函数就会同步执行。监听者返回的任何数据都会被忽略、丢弃。
下列例子展示了一个简单的
EventEmitter实例,它只有一个监听者。eventEmitter.on()方法用来注册监听者,
eventEmitter.emit()方法用来触发事件。
const EventEmitter = require('events'); class MyEmitter extends EventEmitter {} const myEmitter = new MyEmitter(); myEmitter.on('event', () => { console.log('an event occurred!'); }); myEmitter.emit('event');
向监听者传入参数和this
eventEmitter.emit()方法允许向监听者传入任意数量的参数。值得注意的是,当一个监听函数被调用时,this指向这个函数所在的EventEmitter对象。myEmitter.on('event', function(a,b){ console.log('an event occurred!'); console.log(a, b, this); }); myEmitter.emit('event',1,2);
这时this指向EventEmitter对象。
myEmitter.on('event', (a,b) => { console.log('an event occurred!'); console.log(a, b, this); }); myEmitter.emit('event',1,2);
这时this指向{}.
异步 VS 同步
EventListener对象会按照注册的顺序同步执行所有监听函数,这有利于保证事件的正确调用顺序,防止出现逻辑错误。但是在合适的时候,监听函数可以通过setImmediate()or
process.nextTick()方法进行异步调用。
只会执行一次的监听者
利用eventEmitter.once()方法,注册的函数监听者只会被执行一次。
错误事件
当一个EventEmitter实例发生错误时,会抛出一个error事件。如果这个实例没有任何error事件监听函数,那么,会抛出错误并终止node进程。为了防止node的进程中断,可以注册
processobject's
uncaughtExceptionevent事件的监听者。
最佳实践,EventEmitter实例监听error事件.
newListener事件和removeListener事件
在注册一个事件监听函数之前或者移除一个事件监听函数之后,EventEmitter实例会emitnewListener事件和removeListener事件
一个事件的最大监听者数
默认情况下,一个事件的最大监听者数为10,可以通过 emitter.setMaxListeners(n)方法设置,也可以利用
EventEmitter.defaultMaxListeners特性来设置
相关文章推荐
- 二、nodejs图片处理(gm) api: https://www.npmjs.com/package/gm 及 MD5加密:http://nodejs.cn/doc/node/crypto.html#crypto_crypto_createhash_algorithm
- nodejs中的阻塞和非阻塞(https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/)
- Node.js https.server API解析
- node.js入门 - 8.api:events
- http事务机制剖析--https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
- 为重负网络优化 Nginx 和 Node.js --引用自https://linux.cn/article-1314-1.html
- 员提供在线工具,提供jsbin在线 CSS、JS 调试,在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器,...
- https://cnodejs.org/
- node.js在线API: http://www.ostools.net/apidocs/...
- http://classworlds.codehaus.org/apiusage.html
- nw.js node-webkit系列(7)Native UI API Menu的使用
- node.js入门 - 11.api:DNS和加密
- 微信小程序 不在以下合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html
- Node.js RESTful API
- 详解Node.js API系列C/C++ Addons(2) Google V8引擎
- Node.js中的HTTPS示例
- Node.js Request Module…sending json in body for api request with put
- Node.js文档关键模块: Timer, Buffer, Events, Stream, File System
- Node.js v0.10.31API手冊-控制台
- Node.js - RESTful API - web service