NodeJS基础入门-Event

大多数Node.js核心API都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器)。
例如,net.Server对象会在每次有新连接时触发事件;fs.ReadStream会在文件被打开时触发事件;流对象会在数据可读时触发事件。
所有能触发事件的对象都是EventEmitter类的实例。eventEmitterr.on()函数,允许将一个或多个函数绑定到会被对象触发的命名事件上。事件名称通常是驼峰式的字符串,但也可以使用任何有效的JavaScript属性名。
当EventEmitter对象触发一个事件时,所有绑定在该事件上的函数都被同步地调用。监听器的返回值会被丢弃。
例子,一个绑定了一个监听器的EventEmitterr实例。eventEmitter.on()方法用于注册监听器,eventEmitter.emit()方法用于触发事件。

const EventEmitter = require('events');

class CustomEvent extends EventEmitter { 

}

const ce = new CustomEvent();
ce.on('test', ()=>{
  console.log('This is a test!')
});

setInterval(() => {
  ce.emit('test')
},500);

不停的触发这个事件:

This is a test!
This is a test!
This is a test!
This is a test!
This is a test!
This is a test!
This is a test!
This is a test!
^C

Error错误信息打印

const EventEmitter = require('events');

class CustomEvent extends EventEmitter { 

}

const ce = new CustomEvent();
ce.on('error', err =>{
  console.log(err)
});

ce.emit('error',new Error('oops!'));

Error: oops!
at Object. (/home/dex/web/nodejs/event.js:12:17)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:188:16)
at bootstrap_node.js:609:3
1544412983835

监听并触发结果,只调用一次

const EventEmitter = require('events');

class CustomEvent extends EventEmitter { 

}
// 只调用一次
const ce = new CustomEvent();
ce.once('test', () =>{
  console.log('test event');
});

setInterval(() => {
    ce.emit('test')
  }, 500);

test event

移除事件:


class CustomEvent extends EventEmitter {}

function fn1() {
  console.log('fn1');
}
function fn2() {
  console.log('fn2')
}

const ce = new CustomEvent();
ce.on('test', fn1);    //可以绑定多个方法
ce.on('test', fn2);

setInterval(() => {
  ce.emit('test');  
},500);

setTimeout(() => {
  //  ce.removeListener('test',fn2);  //移除fn2

  ce.removeAllListeners('test');    //移除所有事件
}, 2000);

fn1
fn2
fn1
fn2
fn1
fn2
^C

posted @ 2018-12-10 11:41  cicarius  阅读(202)  评论(0编辑  收藏  举报