nodejs中的事件events

1.Events

例子,一个绑定了一个监听器的 EventEmitter 实例。 eventEmitter.on() 方法用于注册监听器,eventEmitter.emit() 方法用于触发事件。

const EventEmitter  = require('events');

class MyEmitter extends EventEmitter {}

const myEimitter = new MyEmitter;
myEimitter.on('event', () => {
    console.log("触发了一个事件!")
});
myEimitter.emit('event');

2.给监听器传入参数与 this

eventEmitter.emit() 方法允许将任意参数传给监听器函数。 当一个普通的监听器函数被 EventEmitter 调用时,标准的 this 关键词会被设置指向监听器所附加的 EventEmitter。

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', function (a, b) {
    console.log(a, b, this);

});
myEmitter.emit('event', 'a', 'b');
// Prints:
//   a b MyEmitter {
//     domain: null,
//     _events: { event: [Function] },
//     _eventsCount: 1,
//     _maxListeners: undefined }

可以使用 ES6 的箭头函数作为监听器。但是这样 this 关键词就不再指向 EventEmitter 实例:

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) =>{
    console.log(a, b, this);

});
myEmitter.emit('event', 'a', 'b');
// Print: a b {}

3.只处理事件一次

当使用 eventEmitter.on() 方法注册监听器时,监听器会在每次触发命名事件时被调用。 也可以使用 ES6 的箭头函数作为监听器。但是这样 this 关键词就不再指向 EventEmitter 实例:

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}

const  myEmitter = new MyEmitter();
let m = 0;
myEmitter.on('event', () => {
    console.log(++m);
});
myEmitter.emit('event');
// Prints: 1
myEmitter.emit('event');
// Prints: 2

使用这个eventEmitter.once()方法,可以注册一个最多被调用一次的特定事件的监听器。一旦事件发出,监听器就被取消注册,然后被调用。

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}

const  myEmitter = new MyEmitter();
let m = 0;
myEmitter.once('event', () => {
    console.log(++m);
});
myEmitter.emit('event');
// Prints: 1
myEmitter.emit('event');
// Ignored

4.错误事件

使用这个eventEmitter.once()方法,可以注册一个最多被调用一次的特定事件的监听器。一旦事件发出,监听器就被取消注册,然后被调用。

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}

const  myEmitter = new MyEmitter();
myEmitter.on('error', (error) => {
    console.log('whoops! There was an error.')
});
myEmitter.emit('error' , new Error('whoops!'));

5.事件newlistener

该EventEmitter实例将发出它自己的’newListener’事件之前 的侦听器添加到其内部的监听者数组。
注册了’newListener’事件的监听器将被传递事件名称和引用被添加的监听器。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// Only do this once so we don't loop forever
myEmitter.once('newListener', (event, listener) => {
    if (event === 'event') {
        //嵌入一个新的监听器
        myEmitter.on('event', () => {
            console.log('B');
        });
    }
});
myEmitter.on('event', () => {
    console.log('A');
});
myEmitter.emit('event');
// Prints:
//   B
//   A

6.listenerCount

一个类方法,返回给定eventName 注册给定的给定的监听器的数量emitter。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(EventEmitter.listenerCount(myEmitter, 'event'));
// Print: 3

7.emitter.eventNames()

一个类方法,返回给定eventName 注册给定的给定的监听器的数量emitter。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(EventEmitter.listenerCount(myEmitter, 'event'));
// Print: 3

8.emitter.listeners(eventName)

返回名为的事件的侦听器数组的副本eventName。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
server.on('connection', (stream) => {
    console.log('Someone connected!');
});
console.log(util.inspect(server.listeners('connection')));

9.emitter.on(eventName,listener)

默认情况下,事件侦听器按照它们添加的顺序被调用。该 emitter.prependListener()方法可以用作将侦听器添加到侦听器数组开头的替代方法。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEE = new MyEmitter();
myEE.on('foo', () => { console.log('a') });
myEE.prependListener('foo', () => { console.log('b') });
myEE.emit('foo');
// Print: B
// Print: A

10.emitter.removeListener(eventName,listener)

removeListener将从监听器数组中最多删除一个监听器实例。如果任何单个侦听器已多次添加到指定的侦听器数组中eventName,则removeListener必须多次调用以删除每个实例。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
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);

// callbackA removes listener callbackB but it will still be called
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Print: A
// Print: B

// callbackB is now removed
// Internal listener array [callbackA]
myEmitter.emit('event');
// Print: A
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值