Latest web development tutorials

نود.جي إس EventEmitter

نود.جي إس جميع متزامنة عملية الإدخال / الإخراج عند الانتهاء سوف ترسل الحدث إلى قائمة انتظار الحدث.

نود.جي إس الذي يتم توزيع العديد من الكائنات الحدث: كائن وزعت net.Server حدث في كل مرة اتصال جديد، وسيتم إصدار الأجسام fs.readStream في حال فتح الملف عند. يتم إنشاؤها كل من هذه الكائنات الأحداث events.EventEmitter سبيل المثال.


الطبقة EventEmitter

الأحداث الوحدة توفر كائن واحد فقط: events.EventEmitter. جوهر EventEmitter هو حزمة وظيفة تشغيل الحدث والمستمع الحدث.

يمكنك ( "الأحداث") التي تتطلب، للوصول إلى وحدة.

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

EventEmitter في حالة حدوث خطأ عندما يتم إنشاء مثيل كائن، فإنه سوف يؤدي إلى "خطأ" حدث. عند إضافة مستمع جديد، يتم تشغيل الحدث "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 1000 ميلي ثانية بعد وقوع الحدث في الكائن، ثم يدعو المستمع 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 (الحدث، مستمع)
إضافة المستمع للمستمع الحدث المحدد لنهاية مجموعة.
2 على (الحدث، مستمع)
لهذا الحدث المحدد لتسجيل المستمع يقبل الحدث سلسلة وظيفة رد.
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 (الحدث، مستمع)
يزيل الحدث المحدد للمستمع، ويجب أن يكون المستمع حدث له المستمعين مسجل.
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners ([حدث])
يزيل كل المستمعين لجميع الأحداث، إذا حدث معين، وإزالة الحدث المحدد لجميع المستمعين.
6 setMaxListeners (ن)
افتراضيا، EventEmitters إذا قمت بإضافة المستمعين أكثر من 10 الإرادة الناتج عن رسالة تحذير. يستخدم setMaxListeners وظيفة لزيادة عدد المستمعين من الحدود الافتراضية.
7 المستمعين (الحدث)
بإرجاع مجموعة من المستمعين لهذا الحدث المحدد.
8 تنبعث منها (الحدث، [ARG1]، [ARG2]، [...])
كل المعلمات أجل تنفيذ المستمع، إذا كان هناك المسجلين المستمع الحدث يعود صحيحا، يعود ذلك كاذب.

أساليب الفئة

لا. طريقة ووصف
1 listenerCount (باعث، الحدث)
إرجاع عدد من المستمعين لهذا الحدث المحدد.

حدث

لا. الأحداث والوصف
1 newListener
  • اسم سلسلة لهذا الحدث- الحدث

  • المستمع - وظيفة التعامل مع الحدث

يتم تشغيل الحدث عند إضافة المستمع الجديد.

2 removeListener
  • اسم سلسلة لهذا الحدث- الحدث

  • المستمع - وظيفة التعامل مع الحدث

إزالة المستمع من مجموعة المستمع محدد. لاحظ أن هذا سيتغير في مؤشر هو أن المستمع بعد المستمع حذفها.

أمثلة

الأمثلة التالية عن طريق الاتصال (الاتصال) يوضح الحدث التطبيقات الطبقة 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 تنص على أنه إذا لم ردا على المستمع، ونود.جي إس استخدامه بمثابة استثناء، الخروج من البرنامج مع رسالة خطأ.

لاستهداف ونحن عموما سوف يؤدي إعدادات المستمع حدث خطأ، وتجنب مواجهة الخطأ في جميع أنحاء تعطل البرنامج. على سبيل المثال:

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، ولكن ورثته في الكائن. بما في ذلك خ م، صافي، المتشعب، بما في ذلك، طالما أن وحدات دعم الاستجابة للحوادث الأساسية هي الفئات الفرعية من EventEmitter.

لماذا؟ هناك سببان:

أولا، يحتوي الكائن على وظيفة الإدراك الفعلي للأحداث التي تلبي رصد الانبعاثات ودلالات، وينبغي أن يكون هذا الحدث كائن.

ثانيا، آلية كائن جافا سكريبت هو، متعددة الأجزاء دعم الميراث النموذج القائم، والأشياء EventEmitter عدم تعطيل الميراث الأصلي.