Latest web development tutorials

Node.js EventEmitter

Node.js การดำเนินการทั้งหมดของ I / O ตรงกันเมื่อเสร็จสิ้นจะส่งเหตุการณ์ไปยังคิวเหตุการณ์

Node.js เหตุการณ์ที่หลายวัตถุที่มีการกระจายวัตถุกระจาย net.Server เหตุการณ์ทุกครั้งที่มีการเชื่อมต่อใหม่วัตถุ fs.readStream จะออกในกรณีที่มีเปิดแฟ้มเมื่อ ทั้งหมดของวัตถุเหล่านี้จะมีการสร้างเหตุการณ์ events.EventEmitter อินสแตนซ์


ระดับ EventEmitter

โมดูลเหตุการณ์ให้เพียงหนึ่งวัตถุ: events.EventEmitter หลัก EventEmitter เป็นแพคเกจการทำงานของเหตุการณ์และเรียกเหตุการณ์ที่ฟัง

คุณสามารถ ( "เหตุการณ์") โดยต้องมี; การเข้าถึงโมดูล

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

EventEmitter หากมีข้อผิดพลาดเกิดขึ้นเมื่อวัตถุถูก instantiated ก็จะเรียกว่า 'ข้อผิดพลาด' เหตุการณ์ เมื่อมีการเพิ่มฟังใหม่เหตุการณ์ 'newListener' จะถูกเรียกเมื่อผู้ฟังจะถูกลบออกเหตุการณ์ 'removeListener' ถูกเรียก

ที่นี่เราใช้เป็นตัวอย่างง่ายๆแสดงการใช้งาน EventEmitter:

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
	console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
	event.emit('some_event'); 
}, 1000); 

ผลการดำเนินการดังต่อไปนี้:

เรียกใช้รหัสนี้หนึ่งครั้งที่สองหลังจากคอนโซลเอาท์พุท'ทริกเกอร์ some_event เหตุการณ์'หลักการคือว่าวัตถุนั้นเป็นเหตุการณ์เหตุการณ์ some_event จดทะเบียนของผู้ฟังและจากนั้นเราส่งเหตุการณ์ some_event โดย setTimeout 1,000 มิลลิวินาทีหลังจากเหตุการณ์ในวัตถุแล้วเรียกฟัง some_event

$ node event.js 
some_event 事件触发

แต่ละเหตุการณ์ EventEmitter โดยชื่อเหตุการณ์และจำนวนของพารามิเตอร์ชื่อเหตุการณ์เป็นสตริงมักจะแสดงความหมายบางอย่าง สำหรับแต่ละเหตุการณ์ EventEmitter สนับสนุนฟังเหตุการณ์หลาย

เมื่อมีเหตุการณ์เกิดขึ้นเหตุการณ์ที่จะลงทะเบียนผู้ฟังเหตุการณ์ที่จะเรียกว่าเป็นลำดับโต้แย้งกลับพารามิเตอร์เหตุการณ์

ให้เรานำตัวอย่างต่อไปนี้แสดงให้เห็นถึงขั้นตอนนี้:

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

เรียกใช้รหัสข้างต้นทำงานดังต่อไปนี้:

$ node event.js 
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

ตัวอย่างข้างต้น, อีซีแอล someEvent ลงทะเบียนสำหรับเหตุการณ์สองเหตุการณ์ฟังแล้วเรียกเหตุการณ์ someEvent

ผลการดำเนินงานสามารถมองเห็นได้ในสองเหตุการณ์ที่ฟังก์ชั่นการโทรกลับได้รับการเรียก นี่คือการใช้งานที่ง่ายที่สุด EventEmitter

EventEmitterให้จำนวนของคุณลักษณะเช่นบนและปล่อยฟังก์ชั่นที่ใช้ในการผูกฟังก์ชั่นเหตุการณ์แอตทริบิวต์ปล่อยจะใช้ในการเรียกเหตุการณ์ ต่อไปเรามาดูคุณสมบัติเฉพาะ EventEmitter อธิบาย

ทาง

เลขที่ วิธีการและคำอธิบาย
1 addListener (event ฟัง)
เพิ่มฟังสำหรับฟังเหตุการณ์ที่ระบุถึงจุดสิ้นสุดของอาร์เรย์
2 ON (เหตุการณ์ฟัง)
สำหรับเหตุการณ์ที่ระบุในการลงทะเบียนผู้ฟังยอมรับเหตุการณ์สตริงและฟังก์ชั่นการติดต่อกลับ
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 ครั้งเดียว (เหตุการณ์ฟัง)
ลงทะเบียนเป็นผู้ฟังที่เดียวสำหรับเหตุการณ์ที่ระบุว่าผู้ฟังส่วนใหญ่จะเรียกครั้งเดียวทันทีหลังจากที่ปล่อยฟังไก
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 removeListener (event ฟัง)
เอาเหตุการณ์ที่ระบุในการฟังฟังจะต้องเป็นกรณีที่มีการลงทะเบียนผู้ฟัง
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners ([เหตุการณ์])
เอาผู้ฟังทุกคนสำหรับกิจกรรมทั้งหมดถ้าเหตุการณ์ที่ระบุเอาเหตุการณ์ที่ระบุสำหรับผู้ฟังทั้งหมด
6 setMaxListeners (N)
โดยค่าเริ่มต้น EventEmitters ถ้าคุณเพิ่มฟังกว่า 10 ออกจะมีข้อความเตือน ฟังก์ชั่น setMaxListeners จะใช้ในการเพิ่มจำนวนของผู้ฟังของวงเงินเริ่มต้น
7 ผู้ฟัง (event)
ส่งกลับอาร์เรย์ของผู้ฟังสำหรับเหตุการณ์ที่ระบุ
8 ปล่อย (เหตุการณ์ [ARG1] [ARG2], [ ... ])
แต่ละพารามิเตอร์เพื่อดำเนินการฟังถ้ามีฟังเหตุการณ์ที่ลงทะเบียนกลับจริงมิฉะนั้นกลับเท็จ

วิธีการเรียน

เลขที่ วิธีการและคำอธิบาย
1 listenerCount (อีซีแอเหตุการณ์)
ส่งกลับจำนวนของผู้ฟังสำหรับเหตุการณ์ที่ระบุ

เหตุการณ์

เลขที่ กิจกรรมและรายละเอียด
1 newListener
  • ชื่อสตริงของเหตุการณ์- เหตุการณ์

  • ฟัง - ฟังก์ชั่นการจัดการเหตุการณ์

กรณีที่มีการเรียกเมื่อคุณเพิ่มฟังใหม่

2 removeListener
  • ชื่อสตริงของเหตุการณ์- เหตุการณ์

  • ฟัง - ฟังก์ชั่นการจัดการเหตุการณ์

นำผู้ฟังจาก array ฟังที่ระบุ โปรดทราบว่านี้จะมีการเปลี่ยนแปลงในดัชนีคือว่าหลังจากที่ฟังฟังลบ

ตัวอย่าง

ตัวอย่างต่อไปนี้ผ่านการเชื่อมต่อ (การเชื่อมต่อ) เหตุการณ์การแสดงให้เห็นถึงการใช้งานระดับ EventEmitter

สร้างไฟล์ main.js ดังต่อไปนี้:

var events = require('events');
var eventEmitter = new events.EventEmitter();

// 监听器 #1
var listener1 = function listener1() {
   console.log('监听器 listener1 执行。');
}

// 监听器 #2
var listener2 = function listener2() {
  console.log('监听器 listener2 执行。');
}

// 绑定 connection 事件,处理函数为 listener1 
eventEmitter.addListener('connection', listener1);

// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

// 处理 connection 事件 
eventEmitter.emit('connection');

// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");

โค้ดข้างต้นผลการดำเนินการดังต่อไปนี้:

$ node main.js
2 个监听器监听连接事件。
监听器 listener1 执行。
监听器 listener2 执行。
listener1 不再受监听。
监听器 listener2 执行。
1 个监听器监听连接事件。
程序执行完毕。

เหตุการณ์ข้อผิดพลาด

EventEmitter กำหนดข้อผิดพลาดกิจกรรมพิเศษจะมีข้อผิดพลาดความหมายที่เรามักจะเรียกเหตุการณ์ข้อผิดพลาดในการเผชิญกับข้อยกเว้น

เมื่อข้อผิดพลาดจะถูกเรียก EventEmitter กำหนดว่าถ้าการตอบสนองต่อผู้ฟังไม่มี Node.js จะใช้เป็นข้อยกเว้นให้ออกจากโปรแกรมที่มีข้อผิดพลาด

ในการกำหนดเป้าหมายโดยทั่วไปเราจะเรียกการตั้งค่าฟังเหตุการณ์ผิดพลาดหลีกเลี่ยงข้อผิดพลาดที่พบตลอดการเกิดปัญหาโปรแกรม ตัวอย่างเช่น:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error'); 

เรียกใช้ข้อผิดพลาดต่อไปนี้จะแสดง:

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
Error: Uncaught, unspecified 'error' event. 
at EventEmitter.emit (events.js:50:15) 
at Object.<anonymous> (/home/byvoid/error.js:5:9) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

EventEmitter มรดก

ส่วนใหญ่เวลาที่เราไม่ได้ใช้โดยตรง EventEmitter แต่ได้รับมรดกในวัตถุ รวมทั้ง FS สุทธิ http รวมทั้งตราบใดที่การตอบสนองต่อเหตุการณ์สนับสนุนโมดูลหลักเป็นคลาสย่อย EventEmitter

ทำไม? มีสองเหตุผลคือ:

ครั้งแรกที่วัตถุมีฟังก์ชันการทำงานของสำนึกทางกายภาพของเหตุการณ์ที่ตอบสนองการตรวจสอบการปล่อยและความหมายเหตุการณ์ที่ควรจะเป็นวัตถุ

ประการที่สองกลไกวัตถุ JavaScript เป็นต้นแบบตามหลายส่วนสนับสนุนการสืบทอดวัตถุ EventEmitter ไม่รบกวนมรดกเดิม