تاریخ انتشار: پنجشنبه, ۱ خرداد ۱۳۹۹، ۱۲:۰۳ ق.ظ نویسنده: محمدیان

Node.js به برنامه نویسان اجازه می دهد تا رویداد های دلخواه خود را ایجاد کنند و هر بار که خواستند آنها را به اجرا درآورند. ماژول events حاوی کلاس EventEmitter است که می‌تواند رویداد ها را ایجاد کرده و آنها را مدیریت کند. فصل سیزدهم آموزش نود.جی اس نتران، به نحوه استفاده از ماژول events برای به اجرا درآوردن یک رویداد اختصاص دارد.

مثال زیر نشان می‌دهد که شما چگونه می‌توانید از کلاس EventEmitter برای ساخت یک رویداد دلخواه استفاده کنید:

// get the reference of EventEmitter class of events module
var events = require('events');

//create an object of EventEmitter class by using above reference
var em = new events.EventEmitter();

//Subscribe for FirstEvent
em.on('FirstEvent', function (data) {
    console.log('First subscriber: ' + data);
});

// Raising FirstEvent
em.emit('FirstEvent', 'This is my first Node.js event emitter example.');

 

در مثال بالا ما ابتدا این ماژول events را ایمپورت کرده و سپس یک شی از کلاس EventEmitter ایجاد می کنیم.

سپس با استفاده از متود on() یک فانکشن مدیریت کننده برای رویداد مورد نظر تعریف می کنیم.

فانکشن on() نام رویداد را به عنوان پارامتر اول و فانکشن مدیریت در صورت رخداد رویداد را به عنوان پارامتر دوم دریافت می کند.

فانکشن emit() یک رویداد را اجرا می کند. در پارامتر اول نام رویداد را باید به این فانکشن بدهید و به عنوان پارامتر دوم می توانید اطلاعات اضافی را به رویداد انتقال دهید.

همچنین شما می توانید با استفاده از متود addListener() در صورت ایجاد رخداد مورد نظر یک فانکشن را اجرا کنید. مانند مثال زیر:

var emitter = require('events').EventEmitter;

var em = new emitter();

//Subscribe FirstEvent
em.addListener('FirstEvent', function (data) {
    console.log('First subscriber: ' + data);
});

//Subscribe SecondEvent
em.on('SecondEvent', function (data) {
    console.log('First subscriber: ' + data);
});

// Raising FirstEvent
em.emit('FirstEvent', 'This is my first Node.js event emitter example.');

// Raising SecondEvent
em.emit('SecondEvent', 'This is my second Node.js event emitter example.');

متود های مهم کلاس EventEmitter

emitter.addListener(event, listener)

این متود یک listener برای یک رویداد خاص به آخر آرایه listener ها اضافه می کند. توجه کنید که بررسی اینکه آیا این listener از قبل وجود دارد یا نه انجام نمی شود.

emitter.on(event, listener)

این متود یک listener برای یک رویداد خاص به آخر آرایه listener ها اضافه می کند. توجه کنید که بررسی اینکه آیا این listener از قبل وجود دارد یا نه انجام نمی شود. از این متود به جای متود addListener می توان استفاده کرد.

emitter.once(event, listener)

این متود فقط برای یک بار، یک رویداد را به اجرا در می آورد.

emitter.removeListener(event, listener)

یک listener را برا یک رویداد خاص حذف می کند.

emitter.removeAllListeners([event])

تمام listener ها را برای یک رویداد خاص حذف می کند.

emitter.setMaxListeners(n)

به طور پیشفرض EventEmitter ها بعد از اضافه کردن ۱۰ عدد listener پیغام هشدار چاپ می کنند.

emitter.getMaxListeners()

مقدار نهایی تعداد listener های ممکن برای یک eventEmiter را باز می گرداند. چه با emitter.setMaxListeners(n) ست شده باشد، چه به صورت پیشفرض

emitter.listeners(event)

یک کپی از آرایه listener ها باز می گرداند.

emitter.emit(event[, arg1][, arg2][, …])

یک رویداد خاص را به اجرا در می آورد.

emitter.listenerCount(type)

تعداد listener هایی که به این نوع رویداد واکنش نشان می دهند را از می گرداند.

روش های متداول استفاده از EventEmitter ها

دو روش متداول برای استفاده از EventEmitter ها در Node.js وجود دارد:

  • بازگرداندن EventEmitter در یک فانکشن
  • توسعه دادن کلاس EventEmitter

بازگرداندن EventEmitter در یک فانکشن

فانکشن سازنده آبجکتی از کلاس EventEmitter را باز می گرداند که برای مدیریت رویداد ها استفاده شده است.

این آبجکت EventEmitter را می توان برای مشترک شدن در رویداد ها استفاده کرد. (یعنی هنگامی که رویداد رخ داد، فانکشنی اجرا شود)

به عنوان مثال به کد زیر توجه کنید:

var emitter = require('events').EventEmitter;

function LoopProcessor(num) {
    var e = new emitter();
    
    setTimeout(function () {
        
        for (var i = 1; i <= num; i++) {
            e.emit('BeforeProcess', i);
            
            console.log('Processing number:' + i);
            
            e.emit('AfterProcess', i);
        }
    }
    , 2000)
    
    return e;
}
var lp = LoopProcessor(3);

lp.on('BeforeProcess', function (data) {
    console.log('About to start the process for ' + data);
});

lp.on('AfterProcess', function (data) {
    console.log('Completed processing ' + data);
});

فصل ۱۳ - مثال ۳

پاسخ اجرای کد بالا چنین خواهد بود:

About to start the process for 1 
Processing number:1
Completed processing 1
About to start the process for 2
Processing number:2
Completed processing 2
About to start the process for 3
Processing number:3
Completed processing 3

در فانکشن LoopProcessor() ابتدا ما یک شی از کلاس EventEmitter ایجاد کرده ایم رویدادهای 'BeforeProcess' و 'AfterProcess' را emit کرده ایم. (emit کردن یعنی اجرا یا انتشار یک رویداد)

در نهایت در این فانکشن با Object ساخته شده از کلاس EventEmitter را باز می گردانیم.

پس ما قادر هستیم با کمک متغیر lp که به فانکشن LoopProcessor() اشاره دارد و اکنون آبجکتی از کلاس EventEmitter است در رویدادها مشترک شویم. اشتراک در رویدادها به کمک فانکشن on() انجام می شود.

به جای فانکشن on() از فانکشن addListener() نیز می توان استفاده کرد.

توسعه دادن کلاس EventEmitter

در این روش مدیریت رویدادها باید در یک فانکشن سازنده کلاس EventEmitter را توسعه دهید و رویدادها را در آن مدیریت کنید.

به مثال زیر توجه کنید:

var emitter = require('events').EventEmitter;

var util = require('util');

function LoopProcessor(num) {
    var me = this;

    setTimeout(function () {
        
        for (var i = 1; i <= num; i++) {
            me.emit('BeforeProcess', i);
            
            console.log('Processing number:' + i);
            
            me.emit('AfterProcess', i);
        }
    }
    , 2000)
        
    return this; 
}

util.inherits(LoopProcessor, emitter)

var lp = new LoopProcessor(3);

lp.on('BeforeProcess', function (data) {
    console.log('About to start the process for ' + data);
});

lp.on('AfterProcess', function (data) {
    console.log('Completed processing ' + data);
});

پاسخ اجرای کد بالا چنین خواهد بود:

About to start the process for 1 
Processing number:1
Completed processing 1
About to start the process for 2
Processing number:2
Completed processing 2
About to start the process for 3
Processing number:3
Completed processing 3 

در مثال بالا ما فانکشن LoopProcessor را با کلاس EventEmitter به وسیله متود util.inherits() گسترش داده ایم. پس this در مثال بالا به کلاس EventEmitter اشاره دارد.

 

منبع : نتران netrun.ir