事件模块是Node.js对观察者模式的实现,通过EventEmitter属性提供构造函数。
该函数提供两个常用函数 一个on 监听 一个 emit 发布
const EventEmitter= require('events');
const observer = new EventEmitter();
observer.on('topic', ()=>{
console.log('topic occured')
})
function main(){
console.log(1)
observer.emit('topic')
console.log(2)
}
//1
// topic occured
//2
EventEmitter 以注册的顺序同步地调用所有监听器。
当然我们也可以将它变为异步使用setImmediate()
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
myEmitter.on('event', (a, b) => {
setImmediate(() => {
console.log('异步地发生');
});
});
myEmitter.emit('event', 'a', 'b');
我们也可以使用eventEmitter.once() 可以注册最多可调用一次的监听器。
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
let m =0;
myEmitter.once('event', () => {
console.log(++m);
});
myEmitter.emit('event');
// 打印: 1
myEmitter.emit('event');
// 不触发
如果实例报错Node.js就会崩溃
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
myEmitter.emit('error', new Error('错误信息'));
最好的办法就是监听报错
myEmitter.on('error', (err) => {
console.error('错误信息');
});
我们也可以使用prependListener将事件监听器添加到监听器数组的开头。
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// 打印:
// b
// a
使用prependOnceListener 当 eventName 事件下次触发时,监听器会先被移除,然后再调用。
const EventEmitter = require('events');
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
myEE.emit('foo');
// 打印:
// b
// a
// a
我们可以使用removeListener() 最多从监听器数组中移除一个监听器
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 移除了监听器 callbackB,但它依然会被调用。
// 触发时内部的监听器数组为 [callbackA, callbackB]
myEmitter.emit('event');
// 打印:
// A
// B
// callbackB 现已被移除。
// 内部的监听器数组为 [callbackA]
myEmitter.emit('event');
// 打印:
// A
在Node.js v11中新加入了events.once
创建一个 Promise,当 EventEmitter 触发给定的事件时则会被解决,当 EventEmitter 触发 'error' 时则会被拒绝。 解决 Promise 时将会带上触发到给定事件的所有参数的数组。
const { once, EventEmitter } = require('events');
async function run() {
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('错误信息');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.log('出错', err);
}
}
run();
网友评论