مقدمة والمعلومات
http://nodejs.org/api/events.html
http://www.infoq.com/cn/articles/tyq-nodejs-event
الأحداث هي أهم وحدة من Node.js. توفر وحدة الأحداث حدث كائن فقط. eventemitter. جوهر EventEmitter هو إطلاق الحدث ومستمع الحدث.
معظم الوحدات في Node.js ورثت من وحدة الحدث.
على عكس الأحداث على شجرة DOM ، لا يوجد أي نشاط مثل التقاط الفقاعات والطبقة.
EventEmitter يدعم العديد من مستمعي الأحداث. عند إطلاق حدث ما ، يتم استدعاء مستمع الحدث المسجل لهذا الحدث بالتسلسل ، ويتم تمرير معلمات الحدث كمعلمات وظيفة رد الاتصال.
كيفية الوصول:
نسخة الكود كما يلي:
تتطلب ("الأحداث") ؛
Emitter.on (حدث ، مستمع)
نسخة الكود كما يلي:
/*
وحدة أحداث الاتصال للحصول على الأحداث. كائن eventemitter
*/
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
/*
eventemitter.on (الحدث ، المستمع) قم بتسجيل مستمع للحدث
المعلمة 1: سلسلة الأحداث ، اسم الحدث
المعلمة 2: وظيفة رد الاتصال
*/
ee.on ('some_events' ، function (foo ، bar) {
console.log ("حدث الاستماع الأول ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}) ؛
console.log ('الجولة الأولى') ؛
ee.emit ('Some_events' ، 'Wilson' ، 'Zhong') ؛
console.log ('الجولة الثانية') ؛
ee.emit ('Some_events' ، 'Wilson' ، 'Z') ؛
eventemitter.on (الحدث ، المستمع) نموذج رمز المصدر
Emitter.emit (الحدث ، [Arg1] ، [Arg2] ، [...])
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
ee.on ('some_events' ، function (foo ، bar) {
console.log ("حدث الاستماع الأول ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}) ؛
/*
eventemitter.emit (الحدث ، [arg1] ، [arg2] ، [...]) يؤدي إلى الحدث المحدد
المعلمة 1: سلسلة الأحداث ، اسم الحدث
المعلمة 2: المعلمات الاختيارية ، تمرير معلمات وظيفة رد الاتصال بالترتيب
قيمة الإرجاع: ما إذا تم الاستماع إلى هذا الحدث
*/
var issuccess = ee.emit ('Some_events' ، 'Wilson' ، 'Zhong') ؛
ee.on ('some_events' ، function (foo ، bar) {
console.log ("حدث الاستماع الثاني ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}) ؛
ee.emit ('Some_events' ، 'Zhong' ، 'Wei') ؛
var issuccess2 = ee.emit ('Other_events' ، 'Wilson' ، 'Zhong') ؛
console.log (issuccess) ؛
console.log (issuccess2) ؛
Emitter.emit (الحدث ، [Arg1] ، [Arg2] ، [...]) عينة رمز المصدر
أجرى المثال ثلاث عمليات أحداث تفعيل ، حيث تسجل Some_events الاستماع ، وستقوم وظيفة SEIT بإرجاع صحيح عند الاتصال ، في حين أن other_events لا تسجل الاستماع ، وستقوم وظيفة SEIT بإرجاع خطأ ، مما يشير إلى أن الحدث غير مستمع ؛ بالطبع ، يمكنك تجاهل قيمة الإرجاع!
Emitter.once (حدث ، مستمع)
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
/*
eventemitter.once (الحدث ، المستمع) سجل الاستماع لمرة واحدة للأحداث ، وإزالة الاستماع بعد التشغيل مرة واحدة
المعلمة 1: سلسلة الأحداث ، اسم الحدث
المعلمة 2: وظيفة رد الاتصال
*/
ee.once ('some_events' ، function (foo ، bar) {
console.log ("حدث الاستماع الأول ، المعلمة 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 (الحدث ، المستمع) نموذج رمز المصدر
من نتائج تنفيذ رمز المثال أعلاه ، يمكننا أن نرى أنه بعد تسجيل مستمع لبعض _events مع Emitter.once ، سيؤدي إلى جولتين من Call Semitter. هذا يعني أن تسجيل المستمع مع Emitter.on يختلف قليلاً عن تسجيل المستمع مع Emitter.on المذكورة سابقًا.
Exitter.once التسجيل الاستماع هو الاستماع لمرة واحدة. عندما يتم تشغيله مرة واحدة ، سيتم إزالة الاستماع! بالطبع ، هو أكثر وضوحا من الاسم ^_ ^!
Emitter.removelistener (حدث ، مستمع)
دعونا نلقي نظرة على مشهد فاشل أولاً ~~~
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
ee.on ('some_events' ، function (foo ، bar) {
console.log ("حدث الاستماع الأول ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}) ؛
/*
عندما رأيت طريقة إزالة الإزالة في واجهة برمجة التطبيقات ، اعتقدت أنه ينبغي أن يكون هكذا
لكن النتيجة^_^!!!
*/
ee.removelistener ('some_events' ، function () {
console.log ('حدث تم إزالته بنجاح some_events الاستماع!') ؛
}) ؛
console.log ('الجولة الأولى') ؛
ee.emit ('Some_events' ، 'Wilson' ، 'Zhong') ؛
Emitter.removelistener (الحدث ، المستمع) عينة الكود المصدر سيناريو الفشل
عندما قمت بتسجيل مستمع لـ Some_events باستخدام Emitter.on ، استخدمت Emitter.removelistener لإزالة مستمع Some_events ، ثم اتصلت بـ Emitter.emit إلى الزناد. أخيرًا ، وجدت أنه لم يسير كما تخيلت! لماذا؟
أعتقد بطبيعة الحال أن المعلمة الثانية لـ emiiter.removelistener هي وظيفة رد الاتصال ، لذلك يجب قراءة واجهة برمجة التطبيقات بعناية! ! !
دعونا نرى مشهدًا ناجحًا آخر ~~~
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
var bearner = function (foo ، bar)
{
console.log ("حدث الاستماع الأول ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}
var leader2 = function (foo ، bar)
{
console.log ("حدث الاستماع الثاني ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}
var leader3 = function (foo ، bar)
{
console.log ("حدث الاستماع الثالث ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}
ee.on ('some_events' ، المستمع) ؛
ee.on ('some_events' ، leader2) ؛
ee.on ('some_events' ، leader3) ؛
/*
Eventemitter.removelistener (الحدث ، المستمع) يزيل المستمع للحدث المحدد
ملاحظة: يجب تسجيل المستمع
ملاحظة: بعد المثال السابق ، سيفشل. السبب الكبير هو تجاهل المستمع. من الطبيعي أن نعتقد أنه لا بأس في تمرير اسم الحدث ، لذلك فهي مأساة!
*/
ee.removelistener ('some_events' ، المستمع) ؛
ee.removelistener ('some_events' ، leader3) ؛
ee.emit ('Some_events' ، 'Wilson' ، 'Zhong') ؛
Emitter.removelistener (الحدث ، المستمع) نموذج رمز مصدر السيناريو الناجح
لقد استخدمت طريقة الكتابة على سبيل المثال ، وأضفت ثلاثة مستمعين إلى بعضهم ، وأزالت المستمعين الأول والثالث ، وأخيراً أثارت بعضها مع Emitter.mit. ليس من الصعب العثور على نتيجة الإخراج أن المستمعين الأول والثالث الذين تمت إزالتهم بالمعاجمين.
بالطبع ، إنه ضار للناس. اتضح أن المعلمة الثانية من Exitter.Removelistener هي المستمع الذي سيتم إزالته ، بدلاً من وظيفة رد الاتصال بعد الإزالة الناجحة ...^_^!
Emitter.removeallisteners ([حدث])
تم استخدام Emitter.removelistener ، ولكن يمكن أن يكون لهذا الحدث مستمعين متعددين. عندما تحتاج الجميع إلى إزالتها ، من الواضح أنها ليست طريقة ممتعة لإزالتها واحدة تلو الأخرى ، ولا تتوافق مع طبيعة كونها كسولًا!
دعونا نختبر الراحة التي جلبتها Emitter.removealllisteners!
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
var bearner = function (foo ، bar)
{
console.log ("حدث الاستماع الأول ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}
var leader2 = function (foo ، bar)
{
console.log ("حدث الاستماع الثاني ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}
ee.on ('some_events' ، المستمع) ؛
ee.on ('some_events' ، leader2) ؛
ee.on ('Other_events' ، وظيفة (foo ، شريط)
{
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.RemoveAllisteners مثال رمز المصدر لمعلمة اسم الحدث الواردة
عند النظر إلى نتائج التنفيذ أعلاه ، ستجد أنه تم تسجيل مستمعين لبعضهم ؛ تم تسجيل مستمع واحد لـ Other_events ؛ اتصلت بـ Emitter.RemoVealLlisteners لتمرير اسم حدث Some_events ؛
أخيرًا ، استخدم وظيفة Exitter.on لتشغيل حدثين: Some_events وغيرها. أخيرًا ، تبين أن المستمعين المسجلين من قبل Some_events غير موجودين ، في حين أن المستمعين المسجلين من قبل الآخرين لا يزالون موجودين ؛
هذا يعني أنه عندما يمر Emitter.RemoVealLlisteners باسم الحدث كمعلمة ، ستتم إزالة جميع المستمعين الذين يمرون باسم الحدث دون التأثير على مستمعي الأحداث الآخرين!
Emitter.RemoveAllisteners يمكن استخدامها دون تمرير معلمات اسم الحدث ؛ تنفيذ مباشرة
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
var bearner = function (foo ، bar)
{
console.log ("حدث الاستماع الأول ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}
var leader2 = function (foo ، bar)
{
console.log ("حدث الاستماع الثاني ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}
ee.on ('some_events' ، المستمع) ؛
ee.on ('some_events' ، leader2) ؛
ee.on ('Other_events' ، وظيفة (foo ، شريط)
{
console.log ("أحداث الاستماع الأخرى ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}) ؛
/*
eventemitter.removealllisteners ([event]) يزيل (الحدث الدُفعات) جميع المستمعين
المعلمة 1: المعلمة الاختيارية ، سلسلة الأحداث ، اسم الحدث
*/
ee.removeallisteners () ؛
ee.emit ('Some_events' ، 'Wilson' ، 'Zhong') ؛
ee.emit ('Other_events' ، 'Wilson' ، 'Zhong') ؛
Emitter.removeAllisteners عينة رمز المصدر دون تمرير المعلمات
يكون رمز العينة هو نفسه تقريبًا كما هو الحال عند المرور في المعلمات ، إلا أنه عند استدعاء Exitter.removeallisteners ، لا يتم تمرير اسم الحدث المحدد ؛
سيجد تشغيل النتائج أن Some_events ومستمعي Other_events لم يعد موجودين ، وسوف يزيل جميع المستمعين! (يجب استخدام أساليب أكثر عنفًا بحذر ~~)
Emitter.Listeners (حدث)
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
var bearner = function (foo ، bar)
{
console.log ("حدث الاستماع الأول ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}
var leader2 = function (foo ، bar)
{
console.log ("حدث الاستماع الثاني ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}
ee.on ('some_events' ، المستمع) ؛
ee.on ('some_events' ، leader2) ؛
ee.on ('Other_events' ، وظيفة (foo ، شريط)
{
console.log ("أحداث الاستماع الأخرى ، المعلمة foo =" + foo + "، bar =" + bar) ؛
}) ؛
/*
eventemitter.listeners (الحدث) // إرجاع مجموعة الاستماع للحدث المحدد
المعلمة 1: سلسلة الأحداث ، اسم الحدث
*/
var stiveereventsarr = ee.listeners ('some_events') ؛
console.log (Listenereventsarr.length)
لـ (var i = stiveEreventsRar.Length-1 ؛ i> = 0 ؛ i--) {
console.log (staneereventsarr [i]) ؛
} ؛
Emitter.Listeners (حدث) نموذج رمز المصدر
قم بتسجيل مستمعين لـ Some_events ، وظيفة Call Emitter.Listeners ، وتمريرها في اسم الحدث some_events ، وتلقي قيمة إرجاع الوظيفة ؛
من النتائج ، يمكننا أن نرى أن قيمة الإرجاع تتلقى مجموعة من جميع الاستماع المسجل لبعضها!
Emitter.setMaxListeners (N)
صحيح أن حدثًا واحدًا يمكن أن يضيف مستمعين متعددين ، ولكن ما هي القيمة القصوى الافتراضية لـ Nodejs؟
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
/*
أضف 11 مستمعًا إلى EventEmitter
*/
لـ (var i = 10 ؛ i> = 0 ؛ i--) {
ee.on ('Some_events' ، function ()
{
console.log ('th' +(i +1) +'bearner') ؛
}) ؛
} ؛
أضف N رموز مصدر عينة الاستماع
في المثال أعلاه ، استخدمت حلقة لإضافة 11 الاستماع إلى بعضها ، وقمت بتنفيذ الكود ، ووجدت أن معلومات التحذير ظهرت ، وكانت المطالبة أكثر تفصيلًا ، لذلك أحتاج إلى استخدام Ensitter.setMaxListeners () لزيادة الحد الأقصى.
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var ee = new eventemitter () ؛
/*
eventemitter.setMaxListeners (N) ضبط الحد الأقصى للاستماع إلى EventEmitter
المعلمة 1: نوع الرقم ، الحد الأقصى لعدد المستمعين
عندما يكون هناك أكثر من 10 مستمعين ، سيتم مطالب الحد الأقصى لعدد المستمعين لـ EventEmitter:
(العقدة) تحذير: تم اكتشاف تسرب ذاكرة EventEmitter ممكن. 11 مستمع أضاف.
استخدم Emitter.setMaxListeners () لزيادة الحد.
يعتقد المصمم أن الكثير من المستمعين قد يؤديون إلى تسرب الذاكرة ، لذلك هناك تحذير مثل هذا التحذير
*/
EE.SetMaxListeners (15) ؛
/*
أضف 11 مستمعًا إلى EventEmitter
*/
لـ (var i = 10 ؛ i> = 0 ؛ i--) {
ee.on ('Some_events' ، function ()
{
console.log ('th' +(i +1) +'bearner') ؛
}) ؛
} ؛
Emitter.setMaxListeners نموذج رمز المصدر
عندما أتصل بـ Emitter.setMaxListeners لتمرير 15 ، يتم تنفيذ الكود ولم تعد معلومات التحذير تظهر ؛
تتمثل وظيفة Emitter.setMaxListeners في تعيين الحد الأقصى لعدد المستمعين لـ EventEmitter. يبدو أنك لست بحاجة إلى ضبط هذه القيمة. يجب أن يكون هناك عدد أقل من الحالات التي لا يكفي!
اعتقد المصمم أن الكثير من المستمعين سيؤديون إلى تسريبات للذاكرة ، لذلك أعطى تحذيرًا!
آخر...
لن أخوض في التفاصيل إذا استخدمت أقل
eventemitter.defaultMaxListeners
eventemitter.defaultMaxListeners وظيفة تشبه setMaxListeners.
اضبط أقصى استماع لجميع الأحداث
SetMaxListeners الأولوية أكبر من DefaultMaxListeners
eventemitter.listenercount (باعث ، حدث)
إرجاع عدد المستمعين للحدث المحدد
خطأ حدث خاص
QUOTE من دليل تطوير Node.js: يحدد EventEmitter خطأً خاصًا للحدث ، والذي يحتوي على دلالات "الخطأ". عادة ما ننبعث منه حدث خطأ عند مواجهة استثناءات. عندما ينبعث خطأ ، يحدد EventEmitter أنه إذا لم يكن هناك مستمع استجابة ، فسيتعامله Node.js كاستثناء ، والخروج من البرنامج وطباعة مكدس الاتصال. نحتاج عمومًا إلى إعداد مستمعين للكائنات التي ستصدر أحداث الخطأ لتجنب تعطل البرنامج بأكمله بعد مواجهة الأخطاء.
ميراث الأحداث
لنتحدث عن ذلك لاحقًا في Util. إذا كنت مهتمًا ، يمكنك التحقق من ذلك بنفسك