/**
*事件和回調處理程序
*異步是基于事件的,不是順序走的
*回調-》事件-》異步-》非阻塞
*/
//標準事件
const EventEmitter = require('events');
const util = require('util');
//通過繼承實現
function MyEmitter() {
EventEmitter.call(this);
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
//定義事件
myEmitter.on('event', () => {
console.log('an event occurred!');
});
//觸發事件
myEmitter.emit('event');
//事件傳參
const EventEmitter = require('events');
const util = require('util');
//通過繼承實現
function MyEmitter() {
EventEmitter.call(this);
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
//添加參數
myEmitter.on('event', function(a, b) {
console.log(a, b, this);
// Prints:
// a b MyEmitter {
// domain: null,
// _events: { event: [Function] },
// _eventsCount: 1,
// _maxListeners: undefined }
});
myEmitter.emit('event', 'a', 'b');
//異步事件
const EventEmitter = require('events');
const util = require('util');
//通過繼承實現
function MyEmitter() {
EventEmitter.call(this);
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
//異步的執行
myEmitter.on('event', (a, b) => {
setImmediate(() => {
console.log('this happens asynchronously');
});
});
myEmitter.emit('event', 'a', 'b');
//事件只允許觸發一次
const EventEmitter = require('events');
const util = require('util');
//通過繼承實現
function MyEmitter() {
EventEmitter.call(this);
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
var m = 0;
//只觸發一次
myEmitter.once('event', () => {
console.log(++m);
});
myEmitter.emit('event');
// Prints: 1
myEmitter.emit('event');
// Ignored
//標準錯誤事件
const EventEmitter = require('events');
const util = require('util');
//通過繼承實現
function MyEmitter() {
EventEmitter.call(this);
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
//myEmitter.emit('error', new Error('whoops!'));
// 拋出錯誤
//此處拋出的錯誤被捕獲
/*process.on('uncaughtException', (err) => {
console.log('whoops! there was an error');
});
myEmitter.emit('error', new Error('whoops!'));
//為了最佳實踐,最好定義事件處理程序*/
myEmitter.on('error', (err) => {
console.log('whoops! there was an error');
});
myEmitter.emit('error', new Error('whoops!'));
// Prints: whoops! there was an error
//標準newListener監聽事件的注冊
const EventEmitter = require('events');
const util = require('util');
//通過繼承實現
function MyEmitter() {
EventEmitter.call(this);
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
// Only do this once so we don't loop forever
//event事件名,listener監聽函數
//同樣的還有removeListener
myEmitter.once('newListener', (event, listener) => {
if (event === 'event') {
// Insert a new listener in front
myEmitter.on('event', () => {
console.log('B');
});
}
});
myEmitter.on('event', () => {
console.log('A');
});
myEmitter.emit('event');
// Prints:
// B
// A
//設置最大監聽數,默認是10
const EventEmitter = require('events');
const util = require('util');
//通過繼承實現
function MyEmitter() {
EventEmitter.call(this);
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
emitter.addListener(event, listener)//另一種用法emitter.on(event, listener).
emitter.getMaxListeners()
EventEmitter.defaultMaxListeners.
emitter.removeAllListeners([event])//刪除listener
emitter.removeListener(event, listener)//刪除具體的listener