当前位置: 移动技术网 > IT编程>开发语言>JavaScript > node.js从入门到放弃(二)

node.js从入门到放弃(二)

2018年10月15日  | 移动技术网IT编程  | 我要评论
上章讲了学习node,应该去学习什么,对这些框架去进行学习现在咋们聊聊如何用原生来进行操作 主要来讲一下events-事件触发器 先来讲一个简单的实例 EventEmitter的实例,绑定一个监听器。用eventEmitter.on()的方法来进行注册一个监听器,eventEmitter.emit( ...

上章讲了学习node,应该去学习什么,对这些框架去进行学习现在咋们聊聊如何用原生来进行操作

主要来讲一下events-事件触发器

先来讲一个简单的实例

eventemitter的实例,绑定一个监听器。用eventemitter.on()的方法来进行注册一个监听器,eventemitter.emit()方法来触发引用事件。

const eventemitter = require('events');

class myemitter extends eventemitter {}
//合并
const myemitter = new myemitter();
myemitter.on('event', () => {
  console.log('触发事件');
});
myemitter.emit('event');

 来咋们来拆分下这段代码,require什么意思呢,可能是我不太懂,我找了一下   

eventemitter 会按照监听器注册的顺序同步地调用所有监听器。 所以必须确保事件的排序正确,且避免竞态条件。 可以使用 setimmediate() 或 process.nexttick() 切换到异步模式:

const myemitter = new myemitter();
myemitter.on('event', (a, b) => {
  setimmediate(() => {
    console.log('异步进行');
  });
});
myemitter.emit('event', 'a', 'b');

 eventemitter.on()与eventemitter.onec()的区别,最明显的区别就是,他们后面的拼写不一样,着实在的的,其实是他们的运行,其中一个能够只要进行触发就会一直运行下去,触发一次运行一次,还有一个是不管你触发多少次,他只运行第一次。用定时器很有意思,并且可以定义多个myemitter,用newlistener来插入。

 

const myemitter = new myemitter();
let m = 0;
myemitter.once('event', () => {
  console.log(++m);
});
myemitter.emit('event');
// 打印: 1
myemitter.emit('event');
// 不触发

  插入用法如下

myemitter.once('newlistener', (event, listener) => {
//插入的是event的,里面也可以去判断下,这个event是否全等另外一个event console.log('b'); });

  node.js中事件的发射器 ,也就是调取的东西在这

class eventemitter {
  // 返回正在监听名为 eventname的事件的监听器数量
  static listenercount(emitter: eventemitter, type: string | number): number;
  
  // 每个事件 默认可注册监听器的最大数量
  static defaultmaxlisteners: number;


  // 修改事件 监听器数量的限制
  setmaxlisteners(n: number): this;
  
  // 调用指定名称事件的 所有监听器
  emit(type: string | number, ...args: any[]): boolean;
  
  // 添加listener 函数到名为 type 的事件监听器数组末尾
  addlistener(type: string | number, listener: listener): this;
  // addlistener 方法的别名
  on(type: string | number, listener: listener): this;
  
  // 添加一个单次listener 函数到名为 eventname的事件。下次触发eventname事件时,监听器会被移除,然后调用
  once(type: string | number, listener: listener): this;
  
  // 从type 的事件监听器数组中移除指定的 listener
  removelistener(type: string | number, listener: listener): this;
  
  // 移除全部或指定type的监听器
  removealllisteners(type?: string | number): this;
  
  // 返回type事件下的监听器数组
  listeners(type: string | number): listener[];
  
  // 返回type事件下监听器数量
  listenercount(type: string | number): number;
}

  其实node的实例,在每个方法下都有限制要注册多少个监听器的,可以用

eventemitter.defaultmaxlisteners来查看下,还可以通过更改他的数值来限定用多少个监听器。
console.log(eventemitter.defaultmaxlisteners)
//默认值10

  上面说了on和once的区别,现在又来了一个addlistener,同样是添加监听事件的东西来看下他的使用方法

emitter.addlisteners("add", ()=>{
  console.log(eventemitter.defaultmaxlisteners)

})
emitter.emit('add');
//10

  可能细心的人发现了,这个方法和上面的又有什么分别呢,我能告诉,没有分别,就是拼的不一样罢了,来验证一下

console.log(emitter.on == emitter.addlistener)
//true

  现在添加监听的事件有了,来看看删除监听事件

const eventemitter = require('events');
const myee = new eventemitter();
const sss = () =>{
  console.log("aaa")
}
myee.on('foo', sss);
myee.on('bar', () => {});

myee.removelistener('foo', sss)

console.log(myee.listeners('foo'))
//[]

  上面的例子就是删除掉了foo监听里的sss事件,看上面了例子发现一个不认识的方法,那就是console.log内的方法myee.listeners(name)这又是啥东西,为啥打印他就能知道他方法内有没有删除呢

这个东西吧,其实就是node.js里面给的一种方法,他返回的是事件监听器里的副本,也就是相当于方法之类的。和他对应的还有一个那就是myee.listenercount(name) 他返回的就是这个事件中有多少的监听数量。

const eventemitter = require('events');
const myee = new eventemitter();
myee.on('bar', () => {});
myee.on('bar', () => {});
myee.on('bar', () => {});
myee.listenercount('bar')
console.log(myee.listenercount('bar'))
//3
myee.listeners('foo')
console.log(myee.listeners('bar'))
//[ [function], [function], [function] ]

  

 如过他要是多个不重名的方法应该怎么办呢,要怎么把他查出来,那就要用到这个方法了myee.eventnames()    这个方法他能够直接的反应你代码用都有那些方法。

const eventemitter = require('events');
const myee = new eventemitter();
const sss = () =>{
  console.log("aaa")
}
myee.on('foo', sss);
myee.on('bar', () => {});
console.log(myee.eventnames());
//[ 'foo', 'bar' ]

  

扯的有点远了,回到刚才,移除监听事件上面的移除事件,是根据条件来进行移除某一条,某一个监听的,下面我们来把所有的监听全部干掉。

const eventemitter = require('events');
const myee = new eventemitter();
const sss = () =>{
  console.log("aaa")
}
myee.on('foo', sss);
myee.on('bar', () => {});

myee.removealllisteners()

  这样你不管console.log哪个监听他都是空的



这里还有一个比较有意思的,看下案例
const myemitter = new myemitter();

const callbacka = () => {
  console.log('a');
  myemitter.removelistener('event', callbackb);
};

const callbackb = () => {
  console.log('b');
};

myemitter.on('event', callbacka);

myemitter.on('event', callbackb);

myemitter.emit('event');
//????

myemitter.emit('event');
//???

 

 最后来说一下,封装监听器,其实理解了上面的这个就不是很难了主要还是一个方法的问题emitter.rawlisteners(eventname)    这个方法的使用。。。
const emitter = new eventemitter();
emitter.once('log', () => console.log('只记录一次'));

// 返回一个数组,包含了一个封装了 `listener` 方法的监听器。
const listeners = emitter.rawlisteners('log');
const logfnwrapper = listeners[0];

// 打印 “只记录一次”,但不会解绑 `once` 事件。
logfnwrapper.listener();

// 打印 “只记录一次”,且移除监听器。
logfnwrapper();

emitter.on('log', () => console.log('持续地记录'));
// 返回一个数组,只包含 `.on()` 绑定的监听器。
const newlisteners = emitter.rawlisteners('log');

// 打印两次 “持续地记录”。
newlisteners[0]();
emitter.emit('log');

 

 

 

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网