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 ไม่รบกวนมรดกเดิม