PENDAHULUAN DAN INFORMASI
http://nodejs.org/api/events.html
http://www.infoq.com/cn/articles/tyq-nodejs-event
Acara adalah modul terpenting dari Node.js. Modul Acara hanya menyediakan acara objek. Eventemitter. Inti dari EventeMitter adalah peluncuran acara dan pendengar acara.
Sebagian besar modul di Node.js diwarisi dari modul acara.
Tidak seperti peristiwa di pohon DOM, tidak ada aktivitas seperti menggelegak, penangkapan lapisan demi lapis.
Eventemitter mendukung beberapa pendengar acara. Ketika suatu acara diluncurkan, pendengar acara yang terdaftar di acara ini dipanggil secara berurutan, dan parameter acara dilewatkan sebagai parameter fungsi panggilan balik.
Cara mengakses:
Salinan kode adalah sebagai berikut:
membutuhkan ('acara');
emitter.on (acara, pendengar)
Salinan kode adalah sebagai berikut:
/*
Hubungi Modul Acara untuk mendapatkan acara. Objek Eventemitter
*/
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
/*
Eventemitter.on (acara, pendengar) Daftarkan pendengar untuk acara tersebut
Parameter 1: String acara, nama acara
Parameter 2: Fungsi Callback
*/
ee.on ('some_events', function (foo, bar) {
Console.log ("Acara Mendengarkan Pertama, Parameter Foo =" + Foo + ", Bar =" + Bar);
});
console.log ('babak pertama');
ee.emit ('Some_events', 'Wilson', 'Zhong');
console.log ('putaran kedua');
ee.emit ('some_events', 'wilson', 'z');
Eventemitter.on (acara, pendengar) Kode sumber sampel
emitter.emit (peristiwa, [arg1], [arg2], [...])
Salinan kode adalah sebagai berikut:
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
ee.on ('some_events', function (foo, bar) {
Console.log ("Acara Mendengarkan Pertama, Parameter Foo =" + Foo + ", Bar =" + Bar);
});
/*
EventeMitter.emit (peristiwa, [arg1], [arg2], [...]) memicu peristiwa yang ditentukan
Parameter 1: String acara, nama acara
Parameter 2: Parameter Opsional, Lewati Parameter Fungsi Callback Secara Berkesatwa
Nilai Pengembalian: Apakah acara ini didengarkan
*/
var issuccess = ee.emit ('some_events', 'wilson', 'zhong');
ee.on ('some_events', function (foo, bar) {
Console.log ("Acara Mendengarkan ke -2, parameter 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 (peristiwa, [arg1], [arg2], [...]) Kode sumber sampel
Contoh ini telah melakukan tiga operasi acara pemicu, di mana beberapa_events mendaftarkan mendengarkan, dan fungsi emit akan mengembalikan true ketika dipanggil, sementara Other_events tidak mendaftarkan mendengarkan, dan fungsi emit akan mengembalikan palsu, menunjukkan bahwa acara tersebut tidak didengarkan; Tentu saja, Anda dapat mengabaikan nilai pengembalian!
emitter.once (acara, pendengar)
Salinan kode adalah sebagai berikut:
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
/*
Eventemitter.once (Event, Listener) Daftarkan Mendengarkan Acara Satu Kali, Hapus Mendengarkan Setelah Memicu sekali
Parameter 1: String acara, nama acara
Parameter 2: Fungsi Callback
*/
ee.once ('some_events', function (foo, bar) {
Console.log ("Acara Mendengarkan Pertama, Parameter Foo =" + Foo + ", Bar =" + Bar);
});
console.log ('babak pertama');
ee.emit ('Some_events', 'Wilson', 'Zhong');
console.log ('putaran kedua');
var issuccess = ee.emit ('some_events', 'wilson', 'zhong');
console.log (issuccess);
Emitter.once (acara, pendengar) Kode Sumber Sampel
Dari contoh hasil eksekusi kode di atas, kita dapat melihat bahwa setelah mendaftarkan pendengar untuk beberapa_events dengan emitter. Ini berarti bahwa mendaftarkan pendengar dengan emitter.
Emitter. Once Registrasi Mendengarkan adalah mendengarkan satu kali. Ketika dipicu sekali, mendengarkan akan dihapus! Tentu saja, lebih jelas dari nama ^_ ^!
emitter.removelistener (acara, pendengar)
Mari kita lihat adegan yang gagal terlebih dahulu ~~~
Salinan kode adalah sebagai berikut:
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
ee.on ('some_events', function (foo, bar) {
Console.log ("Acara Mendengarkan Pertama, Parameter Foo =" + Foo + ", Bar =" + Bar);
});
/*
Ketika saya melihat metode penghapusan removelistener di API, saya pikir itu harus seperti ini
Tapi hasilnya^_^!!!
*/
ee.removeListener ('some_events', function () {
console.log ('Hadiah yang berhasil dihapus Some_events Mendengarkan!');
});
console.log ('babak pertama');
ee.emit ('Some_events', 'Wilson', 'Zhong');
emitter.removeListener (acara, pendengar) Contoh Kode Sumber Skenario Kegagalan
Ketika saya mendaftarkan pendengar untuk beberapa_events menggunakan emitter. Akhirnya, saya menemukan bahwa itu tidak berjalan seperti yang saya bayangkan! Mengapa?
Saya secara alami berpikir bahwa parameter kedua Emiiter.Removelistener adalah fungsi panggilan balik, jadi API harus dibaca dengan cermat! Lai Lai
Mari kita lihat adegan sukses lainnya ~~~
Salinan kode adalah sebagai berikut:
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
var listener = function (foo, bar)
{
Console.log ("Acara Mendengarkan Pertama, Parameter Foo =" + Foo + ", Bar =" + Bar);
}
var listener2 = function (foo, bar)
{
Console.log ("Acara Mendengarkan ke -2, parameter foo =" + foo + ", bar =" + bar);
}
var listener3 = function (foo, bar)
{
Console.log ("Acara Mendengarkan ke -3, Parameter foo =" + foo + ", bar =" + bar);
}
ee.on ('some_events', pendengar);
ee.on ('some_events', listener2);
ee.on ('some_events', listener3);
/*
Eventemitter.RemoveListener (acara, pendengar) menghapus pendengar untuk acara yang ditentukan
Catatan: Pendengar harus terdaftar
PS: Setelah contoh sebelumnya, itu akan gagal. Alasan besar adalah bahwa pendengar diabaikan. Wajar untuk berpikir bahwa tidak apa -apa untuk melewati nama acara, jadi itu adalah tragedi!
*/
ee.removelistener ('some_events', pendengar);
ee.removelistener ('some_events', listener3);
ee.emit ('Some_events', 'Wilson', 'Zhong');
emitter.removeListener (acara, pendengar) Contoh kode sumber skenario yang berhasil
Saya menggunakan metode penulisan contoh, menambahkan tiga pendengar ke beberapa_events, menghapus pendengar pertama dan ketiga, dan akhirnya memicu beberapa_events dengan emitter.emit. Hasil output tidak sulit untuk menemukan bahwa pendengar pertama dan ketiga dihapus dengan emitor. Removelistener tidak berfungsi lagi.
Tentu saja, ini berbahaya bagi orang -orang. Ternyata parameter kedua emitor.
emitter.removealllisteners ([acara])
Emitter.Removelistener telah digunakan, tetapi suatu acara dapat memiliki banyak pendengar. Ketika semua perlu dihapus, itu jelas bukan cara yang menyenangkan untuk menghapusnya satu per satu, dan itu tidak sesuai dengan sifat malas!
Mari kita alami kenyamanan yang dibawa oleh Emitter.removealllisteners!
Salinan kode adalah sebagai berikut:
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
var listener = function (foo, bar)
{
Console.log ("Acara Mendengarkan Pertama, Parameter Foo =" + Foo + ", Bar =" + Bar);
}
var listener2 = function (foo, bar)
{
Console.log ("Acara Mendengarkan ke -2, parameter foo =" + foo + ", bar =" + bar);
}
ee.on ('some_events', pendengar);
ee.on ('some_events', listener2);
ee.on ('Other_events', function (foo, bar)
{
console.log ("Acara mendengarkan lainnya, parameter foo =" + foo + ", bar =" + bar);
});
/*
EventeMitter.Removealllisteners ([Event]) menghapus (acara batch) Semua pendengar
Parameter 1: Parameter opsional, string acara, nama acara
*/
ee.removealllisteners ('some_events');
ee.emit ('Some_events', 'Wilson', 'Zhong');
ee.emit ('Other_events', 'Wilson', 'Zhong');
emitter.removealllisteners Contoh kode sumber untuk parameter nama acara yang masuk
Melihat hasil eksekusi di atas, Anda akan menemukan bahwa dua pendengar terdaftar untuk beberapa_events; Satu pendengar terdaftar untuk Other_events; Saya menelepon emitter.removealllisteners untuk melewati nama acara Some_events;
Akhirnya, gunakan fungsi emitter. Akhirnya, ditemukan bahwa kedua pendengar yang terdaftar oleh Some_events tidak ada, sementara pendengar yang terdaftar oleh Other_events masih ada;
Ini berarti bahwa ketika emitter.removealllisteners melewati dengan nama acara sebagai parameter, semua pendengar yang lewat dalam nama acara akan dihapus tanpa mempengaruhi pendengar acara lainnya!
emitter.removealllisteners dapat digunakan tanpa menyampaikan parameter nama acara; Langsung mengeksekusi
Salinan kode adalah sebagai berikut:
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
var listener = function (foo, bar)
{
Console.log ("Acara Mendengarkan Pertama, Parameter Foo =" + Foo + ", Bar =" + Bar);
}
var listener2 = function (foo, bar)
{
Console.log ("Acara Mendengarkan ke -2, parameter foo =" + foo + ", bar =" + bar);
}
ee.on ('some_events', pendengar);
ee.on ('some_events', listener2);
ee.on ('Other_events', function (foo, bar)
{
console.log ("Acara mendengarkan lainnya, parameter foo =" + foo + ", bar =" + bar);
});
/*
EventeMitter.Removealllisteners ([Event]) menghapus (acara batch) Semua pendengar
Parameter 1: Parameter opsional, string acara, nama acara
*/
ee.removealllisteners ();
ee.emit ('Some_events', 'Wilson', 'Zhong');
ee.emit ('Other_events', 'Wilson', 'Zhong');
emitter.removealllisteners kode sumber sampel tanpa parameter lewat
Kode sampel hampir sama dengan ketika melewati parameter, kecuali bahwa ketika memanggil emitor.
Menjalankan hasilnya akan menemukan bahwa Some_events dan Other_events tidak ada lagi, dan itu akan menghapus semua pendengar! (Metode yang lebih keras harus digunakan dengan hati -hati ~~)
emitter.listeners (acara)
Salinan kode adalah sebagai berikut:
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
var listener = function (foo, bar)
{
Console.log ("Acara Mendengarkan Pertama, Parameter Foo =" + Foo + ", Bar =" + Bar);
}
var listener2 = function (foo, bar)
{
Console.log ("Acara Mendengarkan ke -2, parameter foo =" + foo + ", bar =" + bar);
}
ee.on ('some_events', pendengar);
ee.on ('some_events', listener2);
ee.on ('Other_events', function (foo, bar)
{
console.log ("Acara mendengarkan lainnya, parameter foo =" + foo + ", bar =" + bar);
});
/*
Eventemitter.Listeners (Event) // Mengembalikan array mendengarkan untuk acara yang ditentukan
Parameter 1: String acara, nama acara
*/
var listenereventsarr = ee.listeners ('some_events');
Console.log (listenereventsarr.length)
untuk (var i = listenereventsarr.length-1; i> = 0; i--) {
console.log (listenereventsarr [i]);
};
Emitter.Listeners (acara) Kode Sumber Sampel
Daftarkan dua pendengar untuk Some_events, hubungi Emitter.Listeners Function, lulus dalam nama acara Some_events, dan terima nilai Fungsi Pengembalian;
Dari hasilnya, kita dapat melihat bahwa nilai pengembalian menerima koleksi semua mendengarkan yang terdaftar untuk Some_events!
emitter.setmaxlisteners (n)
Memang benar bahwa satu peristiwa dapat menambahkan banyak pendengar, tetapi berapa nilai maksimum nodej default?
Salinan kode adalah sebagai berikut:
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
/*
Tambahkan 11 pendengar ke Eventemitter
*/
untuk (var i = 10; i> = 0; i--) {
ee.on ('some_events', function ()
{
console.log ('th' +(i +1) +'listener');
});
};
Tambahkan N Mendengarkan Kode Sumber Sampel
Dalam contoh di atas, saya menggunakan loop untuk menambahkan 11 mendengarkan beberapa_events, mengeksekusi kode, dan menemukan bahwa informasi peringatan muncul, dan prompt lebih rinci, jadi saya perlu menggunakan emitter.setMaxListeners () untuk meningkatkan batasnya.
Salinan kode adalah sebagai berikut:
var eventemitter = membutuhkan ('acara'). Eventemitter;
var ee = EventeMitter baru ();
/*
EventeMitter.SetMaxListeners (N) Tetapkan Mendengarkan Maksimum untuk Eventemitter
Parameter 1: n Jenis Angka, Jumlah Maksimum Pendengar
Ketika ada lebih dari 10 pendengar, jumlah maksimum pendengar untuk Eventemitter akan diminta:
(Node) Peringatan: Kemungkinan kebocoran memori Eventemitter terdeteksi. 11 pendengar ditambahkan.
Gunakan emitter.setMaxListeners () untuk meningkatkan batas.
Perancang percaya bahwa terlalu banyak pendengar dapat menyebabkan kebocoran memori, jadi ada peringatan seperti itu
*/
ee.setmaxlisteners (15);
/*
Tambahkan 11 pendengar ke Eventemitter
*/
untuk (var i = 10; i> = 0; i--) {
ee.on ('some_events', function ()
{
console.log ('th' +(i +1) +'listener');
});
};
emitter.setmaxlisteners kode sumber sampel
Ketika saya memanggil emitter.
Fungsi emitter.setmaxlisteners adalah untuk mengatur jumlah maksimum pendengar untuk Eventemitter. Rasanya Anda tidak perlu menetapkan nilai ini. Seharusnya ada lebih sedikit kasus di mana 10 tidak cukup!
Perancang itu berpikir bahwa terlalu banyak pendengar akan menyebabkan kebocoran memori, jadi dia memberi peringatan!
lainnya...
Saya tidak akan masuk ke detail jika saya menggunakan lebih sedikit
Eventemitter.DefaultMaxListeners
Fungsi EventeMitter.DefaultMaxListeners mirip dengan SetMaxListeners.
Tetapkan Mendengarkan Maksimal untuk Semua EventeMitters
Prioritas SetMaxListeners lebih besar dari defaultMaxListeners
Eventemitter.ListenerCount (Emitter, Event)
Mengembalikan jumlah pendengar untuk acara yang ditentukan
Kesalahan acara khusus
Kutipan dari Node.js Panduan Pengembangan: EventeMitter mendefinisikan kesalahan acara khusus, yang berisi semantik "kesalahan". Kami biasanya memancarkan peristiwa kesalahan saat menemukan pengecualian. Ketika kesalahan dipancarkan, EventeMitter menetapkan bahwa jika tidak ada pendengar respons, Node.js akan memperlakukannya sebagai pengecualian, keluar dari program dan mencetak tumpukan panggilan. Kita umumnya perlu mengatur pendengar untuk objek yang akan memancarkan peristiwa kesalahan untuk menghindari seluruh program yang mogok setelah menemukan kesalahan.
Warisan peristiwa
Mari kita bicarakan nanti di Util. Jika Anda tertarik, Anda dapat memeriksanya sendiri http://nodejs.org/api/util.html#util_util_inherite_constructor_superconstructor