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
acara ini dipicu ketika Anda menambahkan pendengar baru. |
2 | removeListener
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.