Latest web development tutorials

Node.js EventEmitter

Node.js semua I / O operasi asynchronous setelah selesai akan mengirim sebuah acara untuk antrian acara.

Node.js yang banyak objek didistribusikan acara: objek terdistribusi net.Server acara setiap kali sambungan baru, benda-benda fs.readStream akan diterbitkan dalam acara file dibuka saat. Semua benda-benda yang dihasilkan peristiwa events.EventEmitter misalnya.


kelas EventEmitter

Peristiwa modul hanya menyediakan satu objek: events.EventEmitter. Inti EventEmitter adalah event-dipicu dan pendengar acara paket fungsi.

Anda dapat ( "peristiwa") oleh membutuhkan, untuk mengakses modul.

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

EventEmitter Jika kesalahan terjadi ketika sebuah benda yang dipakai, itu akan memicu acara 'kesalahan'. Ketika menambahkan pendengar baru, acara 'newListener' dipicu ketika pendengar dihapus, acara 'removeListener' dipicu.

Di sini kita menggunakan contoh sederhana menunjukkan penggunaan 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); 

Hasil eksekusi adalah sebagai berikut:

Menjalankan kode ini, satu detik setelah output konsol'some_event memicu event'.Prinsipnya adalah bahwa objek tersebut acara acara some_event dari pendengar terdaftar, dan kemudian kami mengirim peristiwa some_event oleh setTimeout 1000 milidetik setelah acara dalam objek, kemudian memanggil some_event pendengar.

$ node event.js 
some_event 事件触发

Setiap acara EventEmitter oleh nama acara dan sejumlah parameter, nama acara adalah string, biasanya dinyatakan semantik tertentu. Untuk setiap peristiwa, EventEmitter mendukung beberapa pendengar acara.

Ketika peristiwa itu terjadi, acara untuk mendaftar pendengar acara secara berurutan disebut sebagai argumen callback acara parameter.

Mari kita ambil contoh berikut menggambarkan proses ini:

//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 参数'); 

Jalankan kode di atas, jalankan sebagai berikut:

$ node event.js 
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

Contoh di atas, emitor someEvent terdaftar untuk acara tersebut, dua pendengar acara, kemudian memicu peristiwa someEvent.

Hasil operasi dapat dilihat pada dua event fungsi pendengar callback telah disebut. Ini adalah EventEmitter penggunaan termudah.

EventEmitter menyediakan sejumlah atribut, sepertipada dan memancarkan.pada fungsi digunakan untuk mengikatfungsi acara,memancarkan atribut digunakan untuk memicu suatu peristiwa. Berikutnya kita melihat sifat EventEmitter khusus yang dijelaskan.

cara

Tidak. Metode & deskripsi
1 addListener (event, pendengar)
Menambahkan pendengar untuk pendengar acara tertentu untuk akhir array.
2 pada (acara, pendengar)
Untuk acara tertentu untuk mendaftarkan pendengar menerima acara tali dan fungsi callback.
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 sekali (event, pendengar)
Mendaftar pendengar tunggal untuk acara tertentu, yang sebagian besar pendengar akan memicu sekali, segera setelah merilis pemicu pendengar.
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 removeListener (event, pendengar)
Menghapus acara tertentu untuk pendengar, pendengar harus acara memiliki pendengar yang terdaftar.
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners ([event])
Menghapus semua pendengar untuk semua acara, jika acara tertentu, menghapus acara yang ditentukan untuk semua pendengar.
6 setMaxListeners (n)
Secara default, EventEmitters jika Anda menambahkan pendengar lebih dari 10 akan menampilkan pesan peringatan. Fungsi setMaxListeners digunakan untuk meningkatkan jumlah pendengar dari batas default.
7 pendengar (event)
Mengembalikan array pendengar untuk acara tertentu.
8 memancarkan (acara, [arg1], [arg2], [...])
Setiap parameter perintah eksekusi pendengar, jika ada terdaftar pendengar acara mengembalikan true, jika tidak kembali palsu.

metode kelas

Tidak. Metode & deskripsi
1 listenerCount (emitor, event)
Mengembalikan jumlah pendengar untuk acara tertentu.

peristiwa

Tidak. Acara & Deskripsi
1 newListener
  • Nama string acara- acara

  • pendengar - fungsi penanganan event

acara ini dipicu ketika Anda menambahkan pendengar baru.

2 removeListener
  • Nama string acara- acara

  • pendengar - fungsi penanganan event

Hapus pendengar dari berbagai pendengar yang ditentukan. Catatan bahwa ini akan berubah dalam indeks adalah bahwa pendengar setelah pendengar dihapus.

contoh

Berikut ini contoh melalui koneksi (koneksi) acara menunjukkan aplikasi kelas EventEmitter.

Membuat file main.js, sebagai berikut:

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("程序执行完毕。");

Kode di atas, hasil pelaksanaan adalah sebagai berikut:

$ node main.js
2 个监听器监听连接事件。
监听器 listener1 执行。
监听器 listener2 执行。
listener1 不再受监听。
监听器 listener2 执行。
1 个监听器监听连接事件。
程序执行完毕。

acara kesalahan

EventEmitter mendefinisikan kesalahan acara khusus, mengandung kesalahan semantik, kita biasanya akan memicu peristiwa kesalahan dalam menghadapi pengecualian.

Ketika kesalahan dipicu, EventEmitter menetapkan bahwa jika tidak ada respon untuk pendengar, Node.js akan menggunakannya sebagai pengecualian, keluar dari program dengan pesan kesalahan.

Untuk menargetkan kita umumnya akan memicu pengaturan pendengar acara kesalahan, menghindari kesalahan ditemui di seluruh program crash. Sebagai contoh:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error'); 

Jalankan kesalahan berikut ditampilkan:

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 warisan

Sebagian besar waktu kita tidak langsung menggunakan EventEmitter, tapi mewarisinya dalam objek. Termasuk fs, bersih, http, termasuk, asalkan modul dukungan insiden respon inti adalah subclass dari EventEmitter.

Mengapa? Ada dua alasan:

Pertama, objek memiliki fungsi realisasi fisik peristiwa yang memenuhi monitor emisi dan semantik, acara harus menjadi objek.

Kedua, mekanisme objek JavaScript adalah berbasis prototipe, multi-bagian dukungan warisan, objek EventEmitter tidak mengganggu warisan asli.