บทนำและข้อมูล
http://nodejs.org/api/events.html
http://www.infoq.com/cn/articles/tyq-nodejs-event
เหตุการณ์เป็นโมดูลที่สำคัญที่สุดของ Node.js โมดูลกิจกรรมมีเพียงวัตถุ event.eventemitter แกนหลักของ Eventemitter คือการเปิดตัวกิจกรรมและผู้ฟังกิจกรรม
โมดูลส่วนใหญ่ใน node.js ได้รับการสืบทอดมาจากโมดูลเหตุการณ์
แตกต่างจากเหตุการณ์บนต้นไม้ DOM ไม่มีกิจกรรมเช่นเดือดการจับภาพเลเยอร์โดยเลเยอร์
Eventemitter รองรับผู้ฟังกิจกรรมหลายคน เมื่อมีการเปิดตัวเหตุการณ์ผู้ฟังเหตุการณ์ที่ลงทะเบียนกับเหตุการณ์นี้จะถูกเรียกตามลำดับและพารามิเตอร์เหตุการณ์จะถูกส่งผ่านเป็นพารามิเตอร์ฟังก์ชันการโทรกลับ
วิธีการเข้าถึง:
การคัดลอกรหัสมีดังนี้:
ต้องการ ('เหตุการณ์');
emitter.on (เหตุการณ์ผู้ฟัง)
การคัดลอกรหัสมีดังนี้:
-
โมดูลการโทรหาเหตุการณ์เพื่อรับกิจกรรม eventemitter วัตถุ
-
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
-
Eventemitter.on (เหตุการณ์ผู้ฟัง) ลงทะเบียนผู้ฟังสำหรับกิจกรรม
พารามิเตอร์ 1: สตริงเหตุการณ์ชื่อเหตุการณ์
พารามิเตอร์ 2: ฟังก์ชั่นการโทรกลับ
-
ee.on ('some_events', ฟังก์ชั่น (foo, bar) {
console.log ("เหตุการณ์การฟังครั้งที่ 1 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
console.log ('รอบแรก');
ee.emit ('some_events', 'Wilson', 'Zhong');
console.log ('รอบที่สอง');
ee.emit ('some_events', 'Wilson', 'z');
Eventemitter.on (Event, Listener) ตัวอย่างซอร์สโค้ดตัวอย่าง
emitter.emit (เหตุการณ์, [arg1], [arg2], [... ])
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
ee.on ('some_events', ฟังก์ชั่น (foo, bar) {
console.log ("เหตุการณ์การฟังครั้งที่ 1 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
-
Eventemitter.emit (เหตุการณ์, [arg1], [arg2], [... ]) ทริกเกอร์เหตุการณ์ที่ระบุ
พารามิเตอร์ 1: สตริงเหตุการณ์ชื่อเหตุการณ์
พารามิเตอร์ 2: พารามิเตอร์เสริมส่งพารามิเตอร์ของฟังก์ชันการโทรกลับตามลำดับ
ค่าส่งคืน: ไม่ว่าจะรับฟังเหตุการณ์นี้
-
var issuccess = ee.emit ('some_events', 'Wilson', 'Zhong');
ee.on ('some_events', ฟังก์ชั่น (foo, bar) {
console.log ("เหตุการณ์การฟังที่ 2 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
ee.emit ('some_events', 'zhong', 'wei');
var issuccess2 = ee.emit ('otter_events', 'Wilson', 'Zhong');
console.log (issuccess);
console.log (issuccess2);
emitter.emit (เหตุการณ์, [arg1], [arg2], [... ]) ตัวอย่างซอร์สโค้ดตัวอย่าง
ตัวอย่างได้ดำเนินการสามเหตุการณ์ที่เรียกใช้ซึ่งบางคนลงทะเบียนการฟังและฟังก์ชั่น EMIT จะกลับมาเป็นจริงเมื่อเรียกว่าในขณะที่ other_events ไม่ได้ลงทะเบียนการฟังและฟังก์ชั่น EMIT จะกลับมาเป็นเท็จแสดงว่าเหตุการณ์ไม่ได้ฟัง แน่นอนคุณสามารถเพิกเฉยต่อค่าคืนได้!
emitter.once (เหตุการณ์ผู้ฟัง)
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
-
Eventemitter.once (เหตุการณ์, ผู้ฟัง) ลงทะเบียนการฟังครั้งเดียวสำหรับกิจกรรมลบการฟังหลังจากทริกเกอร์หนึ่งครั้ง
พารามิเตอร์ 1: สตริงเหตุการณ์ชื่อเหตุการณ์
พารามิเตอร์ 2: ฟังก์ชั่นการโทรกลับ
-
ee.once ('some_events', ฟังก์ชั่น (foo, bar) {
console.log ("เหตุการณ์การฟังครั้งที่ 1 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
console.log ('รอบแรก');
ee.emit ('some_events', 'Wilson', 'Zhong');
console.log ('รอบที่สอง');
var issuccess = ee.emit ('some_events', 'Wilson', 'Zhong');
console.log (issuccess);
emitter.once (เหตุการณ์, ผู้ฟัง) ซอร์สโค้ดตัวอย่าง
จากผลการดำเนินการรหัสตัวอย่างข้างต้นเราจะเห็นว่าหลังจากลงทะเบียนผู้ฟังสำหรับ some_events ด้วย emitter.once มันจะทริกเกอร์ในสองรอบของ emitter.emit และรอบที่สองจะกลับเท็จ ซึ่งหมายความว่าการลงทะเบียนผู้ฟังด้วย emitter.on นั้นแตกต่างจากการลงทะเบียนผู้ฟังเล็กน้อยด้วย emitter.on ที่กล่าวถึงก่อนหน้านี้
emitter.once การฟังการลงทะเบียนเป็นการฟังครั้งเดียว เมื่อทริกเกอร์หนึ่งครั้งการฟังจะถูกลบออก! แน่นอนว่ามันชัดเจนมากขึ้นจากชื่อ ^_ ^!
emitter.removelistener (เหตุการณ์ผู้ฟัง)
มาดูฉากที่ล้มเหลวก่อน ~~~
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
ee.on ('some_events', ฟังก์ชั่น (foo, bar) {
console.log ("เหตุการณ์การฟังครั้งที่ 1 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
-
เมื่อฉันเห็นวิธีการกำจัด removeListener ใน API ฉันคิดว่ามันควรจะเป็นเช่นนี้
แต่ผลลัพธ์^_^!!!
-
ee.remoVelistener ('some_events', function () {
console.log ('ลบเหตุการณ์ประสบความสำเร็จบางอย่างการฟัง!');
-
console.log ('รอบแรก');
ee.emit ('some_events', 'Wilson', 'Zhong');
emitter.remoVelistener (เหตุการณ์, ผู้ฟัง) ตัวอย่างซอร์สโค้ดสถานการณ์ความล้มเหลว
เมื่อฉันลงทะเบียนผู้ฟังสำหรับบางคนโดยใช้ emitter.on ฉันใช้ emitter.remoVelistener เพื่อลบผู้ฟังบางคนออกแล้วเรียกว่า emitter.emit เพื่อทริกเกอร์ ในที่สุดฉันก็พบว่ามันไม่ได้ดำเนินการตามที่ฉันจินตนาการไว้! ทำไม
ฉันคิดอย่างเป็นธรรมชาติว่าพารามิเตอร์ที่สองของ Emiiter.remoVelistener เป็นฟังก์ชั่นการโทรกลับดังนั้น API ควรอ่านอย่างรอบคอบ! - -
มาดูฉากที่ประสบความสำเร็จอีกครั้ง ~~~
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
var listener = function (foo, bar)
-
console.log ("เหตุการณ์การฟังครั้งที่ 1 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
var listener2 = function (foo, bar)
-
console.log ("เหตุการณ์การฟังที่ 2 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
var listener3 = function (foo, bar)
-
console.log ("เหตุการณ์การฟังครั้งที่ 3 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
ee.on ('some_events', ผู้ฟัง);
ee.on ('some_events', Listener2);
ee.on ('some_events', Listener3);
-
Eventemitter.remoVelistener (Event, Listener) ลบผู้ฟังสำหรับเหตุการณ์ที่ระบุ
หมายเหตุ: ผู้ฟังจะต้องลงทะเบียน
PS: หลังจากตัวอย่างก่อนหน้ามันจะล้มเหลว เหตุผลใหญ่คือผู้ฟังถูกเพิกเฉย เป็นเรื่องธรรมดาที่จะคิดว่ามันโอเคที่จะผ่านชื่อเหตุการณ์ดังนั้นมันจึงเป็นโศกนาฏกรรม!
-
ee.removelistener ('some_events', ผู้ฟัง);
ee.removeListener ('some_events', Listener3);
ee.emit ('some_events', 'Wilson', 'Zhong');
emitter.removelistener (เหตุการณ์, ผู้ฟัง) ตัวอย่างซอร์สโค้ดสถานการณ์สถานการณ์ที่ประสบความสำเร็จ
ฉันใช้วิธีการเขียนตัวอย่างเพิ่มผู้ฟังสามคนลงใน Some_events ลบผู้ฟังที่หนึ่งและสามและในที่สุดก็เรียกใช้ _events ด้วย emitter.emit ผลลัพธ์ผลลัพธ์นั้นไม่ยากที่จะพบว่าผู้ฟังคนแรกและคนที่สามถูกลบออกด้วย emitter.removelistener ไม่ทำงานอีกต่อไป
แน่นอนว่ามันเป็นอันตรายต่อผู้คน ปรากฎว่าพารามิเตอร์ที่สองของ emitter.removelistener เป็นผู้ฟังที่จะถูกลบออกแทนที่จะใช้ฟังก์ชั่นการโทรกลับหลังจากการลบที่ประสบความสำเร็จ ...^_^!
emitter.removealllisteners ([Event])
emitter.removelistener ถูกนำมาใช้ แต่เหตุการณ์สามารถมีผู้ฟังหลายคน เมื่อจำเป็นต้องลบออกทั้งหมดมันไม่ได้เป็นวิธีที่น่าพอใจในการลบออกทีละคนและมันไม่สอดคล้องกับธรรมชาติของการขี้เกียจ!
มาสัมผัสกับความสะดวกสบายที่เกิดจาก emitter.removealllisteners!
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
var listener = function (foo, bar)
-
console.log ("เหตุการณ์การฟังครั้งที่ 1 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
var listener2 = function (foo, bar)
-
console.log ("เหตุการณ์การฟังที่ 2 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
ee.on ('some_events', ผู้ฟัง);
ee.on ('some_events', Listener2);
ee.on ('other_events', ฟังก์ชั่น (foo, bar)
-
console.log ("เหตุการณ์การฟังอื่น ๆ , พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
-
Eventemitter.removealllisteners ([Event]) ลบ (เหตุการณ์แบตช์) ผู้ฟังทั้งหมด
พารามิเตอร์ 1: พารามิเตอร์เสริม, สตริงเหตุการณ์, ชื่อเหตุการณ์
-
ee.removealllisteners ('some_events');
ee.emit ('some_events', 'Wilson', 'Zhong');
ee.emit ('other_events', 'Wilson', 'Zhong');
emitter.removealllisteners ตัวอย่างซอร์สโค้ดสำหรับพารามิเตอร์ชื่อเหตุการณ์ขาเข้า
เมื่อดูผลการดำเนินการข้างต้นคุณจะพบว่ามีผู้ฟังสองคนลงทะเบียนสำหรับ Some_events; ผู้ฟังหนึ่งคนลงทะเบียนสำหรับ other_events; ฉันเรียก emitter.removealllisteners เพื่อส่งชื่อเหตุการณ์บางอย่าง;
ในที่สุดใช้ฟังก์ชัน emitter.on เพื่อทริกเกอร์เหตุการณ์สองเหตุการณ์: some_events และ other_events ในที่สุดก็พบว่าผู้ฟังทั้งสองที่ลงทะเบียนโดย Some_events ไม่มีอยู่ในขณะที่ผู้ฟังที่ลงทะเบียนโดย other_events ยังคงมีอยู่;
ซึ่งหมายความว่าเมื่อ emitter.removealllisteners ผ่านชื่อเหตุการณ์เป็นพารามิเตอร์ผู้ฟังทั้งหมดที่ผ่านชื่อเหตุการณ์จะถูกลบออกโดยไม่ส่งผลกระทบต่อผู้ฟังเหตุการณ์อื่น ๆ !
emitter.removealllisteners สามารถใช้งานได้โดยไม่ต้องผ่านพารามิเตอร์ชื่อเหตุการณ์ ดำเนินการโดยตรง
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
var listener = function (foo, bar)
-
console.log ("เหตุการณ์การฟังครั้งที่ 1 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
var listener2 = function (foo, bar)
-
console.log ("เหตุการณ์การฟังที่ 2 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
ee.on ('some_events', ผู้ฟัง);
ee.on ('some_events', Listener2);
ee.on ('other_events', ฟังก์ชั่น (foo, bar)
-
console.log ("เหตุการณ์การฟังอื่น ๆ , พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
-
Eventemitter.removealllisteners ([Event]) ลบ (เหตุการณ์แบตช์) ผู้ฟังทั้งหมด
พารามิเตอร์ 1: พารามิเตอร์เสริม, สตริงเหตุการณ์, ชื่อเหตุการณ์
-
ee.removealllisteners ();
ee.emit ('some_events', 'Wilson', 'Zhong');
ee.emit ('other_events', 'Wilson', 'Zhong');
emitter.removealllisteners ซอร์สโค้ดตัวอย่างโดยไม่ต้องผ่านพารามิเตอร์
รหัสตัวอย่างเกือบจะเหมือนกับเมื่อผ่านพารามิเตอร์ยกเว้นว่าเมื่อโทรหา emitter.removealllisteners ไม่มีชื่อเหตุการณ์ที่ระบุจะถูกส่งผ่าน;
การรันผลลัพธ์จะพบว่าไม่มีผู้ฟัง Some_events และอื่น ๆ อีกต่อไปและจะลบผู้ฟังทั้งหมด! (ควรใช้วิธีการที่มีความรุนแรงมากขึ้นด้วยความระมัดระวัง ~~)
emitter.listeners (เหตุการณ์)
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
var listener = function (foo, bar)
-
console.log ("เหตุการณ์การฟังครั้งที่ 1 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
var listener2 = function (foo, bar)
-
console.log ("เหตุการณ์การฟังที่ 2 พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
ee.on ('some_events', ผู้ฟัง);
ee.on ('some_events', Listener2);
ee.on ('other_events', ฟังก์ชั่น (foo, bar)
-
console.log ("เหตุการณ์การฟังอื่น ๆ , พารามิเตอร์ foo =" + foo + ", bar =" + bar);
-
-
Eventemitter.Listeners (เหตุการณ์) // ส่งคืนอาร์เรย์การฟังสำหรับเหตุการณ์ที่ระบุ
พารามิเตอร์ 1: สตริงเหตุการณ์ชื่อเหตุการณ์
-
var listenerEventSarr = ee.listeners ('some_events');
console.log (ListenerEventSarr.length)
สำหรับ (var i = listenerEventSarr.length-1; i> = 0; i--) {
console.log (ListenerEventSarr [i]);
-
emitter.Listeners (เหตุการณ์) ซอร์สโค้ดตัวอย่าง
ลงทะเบียนผู้ฟังสองคนสำหรับ Some_events โทรหาฟังก์ชัน emitter.listeners ส่งผ่านในชื่อเหตุการณ์ Some_events และรับค่าคืนฟังก์ชัน;
จากผลลัพธ์เราจะเห็นว่าค่าส่งคืนได้รับการรวบรวมการฟังที่ลงทะเบียนทั้งหมดสำหรับ Some_events!
emitter.setMaxListeners (n)
เป็นความจริงที่เหตุการณ์หนึ่งสามารถเพิ่มผู้ฟังหลายคนได้ แต่ค่าสูงสุดเริ่มต้นของ NodeJS คืออะไร?
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
-
เพิ่มผู้ฟัง 11 คนใน Eventemitter
-
สำหรับ (var i = 10; i> = 0; i--) {
ee.on ('some_events', ฟังก์ชั่น ()
-
console.log ('th' +(i +1) +'Listener');
-
-
เพิ่มรหัสแหล่งที่มาของการฟัง
ในตัวอย่างข้างต้นฉันใช้ลูปเพื่อเพิ่มการฟัง 11 ครั้งให้กับ Some_events ดำเนินการรหัสและพบว่าข้อมูลการเตือนปรากฏขึ้นและพรอมต์มีรายละเอียดมากขึ้นดังนั้นฉันต้องใช้ emitter.setMaxListeners () เพื่อเพิ่มขีด จำกัด
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var ee = new Eventemitter ();
-
Eventemitter.SetMaxListeners (n) ตั้งค่าการฟังสูงสุดสำหรับ Eventemitter
พารามิเตอร์ 1: ประเภทหมายเลข n จำนวนผู้ฟังสูงสุด
เมื่อมีผู้ฟังมากกว่า 10 คนจำนวนผู้ฟังสูงสุดสำหรับ Eventemitter จะได้รับแจ้ง:
(โหนด) คำเตือน: ตรวจพบการรั่วไหลของหน่วยความจำเหตุการณ์ที่เป็นไปได้ เพิ่มผู้ฟัง 11 คน
ใช้ emitter.setMaxListeners () เพื่อเพิ่มขีด จำกัด
นักออกแบบเชื่อว่าผู้ฟังจำนวนมากเกินไปอาจนำไปสู่การรั่วไหลของหน่วยความจำดังนั้นจึงมีคำเตือนเช่นนี้
-
EE.SetMaxListeners (15);
-
เพิ่มผู้ฟัง 11 คนใน Eventemitter
-
สำหรับ (var i = 10; i> = 0; i--) {
ee.on ('some_events', ฟังก์ชั่น ()
-
console.log ('th' +(i +1) +'Listener');
-
-
emitter.setMaxListeners ซอร์สโค้ดตัวอย่าง
เมื่อฉันเรียก emitter.setMaxListeners ผ่านใน 15 รหัสจะถูกดำเนินการและข้อมูลการเตือนจะไม่ปรากฏขึ้นอีกต่อไป
ฟังก์ชั่น emitter.setMaxListeners คือการตั้งค่าจำนวนผู้ฟังสูงสุดสำหรับ Eventemitter รู้สึกเหมือนคุณไม่จำเป็นต้องตั้งค่านี้ ควรมีกรณีน้อยกว่าที่ 10 ไม่เพียงพอ!
นักออกแบบคิดว่าผู้ฟังจำนวนมากเกินไปจะทำให้เกิดการรั่วไหลของหน่วยความจำดังนั้นเขาจึงเตือน!
อื่น...
ฉันจะไม่เข้าไปดูรายละเอียดถ้าฉันใช้น้อยลง
Eventemitter.defaultMaxListeners
ฟังก์ชั่น Eventemitter.defaultMaxListeners คล้ายกับ SetMaxListeners
ตั้งค่าการฟังสูงสุดสำหรับ Eventemitters ทั้งหมด
ลำดับความสำคัญของ SetMaxListeners มากกว่า defaultMaxListeners
Eventemitter.listenercount (Emitter, Event)
ส่งคืนจำนวนผู้ฟังสำหรับเหตุการณ์ที่ระบุ
ข้อผิดพลาดเหตุการณ์พิเศษ
คำพูดจาก Node.js คู่มือการพัฒนา: Eventemitter กำหนดข้อผิดพลาดเหตุการณ์พิเศษซึ่งมีความหมายของ "ข้อผิดพลาด" เรามักจะปล่อยเหตุการณ์ข้อผิดพลาดเมื่อพบข้อยกเว้น เมื่อมีการปล่อยข้อผิดพลาด Eventemitter ระบุว่าหากไม่มีการตอบสนองการตอบสนอง node.js จะถือว่าเป็นข้อยกเว้นให้ออกจากโปรแกรมและพิมพ์สแต็กการโทร โดยทั่วไปเราจำเป็นต้องตั้งค่าผู้ฟังสำหรับวัตถุที่จะปล่อยเหตุการณ์ข้อผิดพลาดเพื่อหลีกเลี่ยงโปรแกรมทั้งหมดที่ล้มเหลวหลังจากพบข้อผิดพลาด
มรดกของเหตุการณ์
มาพูดถึงเรื่องนี้ใน Util หากคุณสนใจคุณสามารถตรวจสอบได้ด้วยตัวเอง http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor