Rumah > hujung hadapan web > tutorial js > Node.js belajar dan bersembang tentang modul Acara

Node.js belajar dan bersembang tentang modul Acara

青灯夜游
Lepaskan: 2021-12-24 18:18:27
ke hadapan
4347 orang telah melayarinya

Artikel ini akan membawa anda melalui modul Acara dalam Node.js dan memperkenalkan model terbitan dan langganan dalam Acara saya harap ia akan membantu anda!

Node.js belajar dan bersembang tentang modul Acara

Modul acara

Rujukan tapak web rasmi: pencetus acara acara | Node.js

http ://nodejs.cn/api/events.html

Events modul ialah modul terpenting Node Ia menyediakan atribut EventEmitter teras EventEmitter ialah pelepasan peristiwa dan Pendengar acara. Kebanyakan modul dalam

Nod mewarisi daripada modul Events. Modul

  • Events ialah pelaksanaan Node bagi corak publish-subscribe (publish/subscribe). Satu objek menghantar mesej ke objek lain melalui modul ini.
  • Modul ini menyediakan pembina melalui atribut EventEmitter. Contoh pembina ini mempunyai on kaedah yang boleh digunakan untuk mendengar acara tertentu dan mencetuskan fungsi panggil balik.
  • Sebarang objek boleh menerbitkan acara tertentu, yang dipantau oleh kaedah on contoh EventEmitter.

Model Terbit-Langgan

Mengenai Model Terbit-Langgan, anda boleh rujuk artikel blog saya sebelum ini.

Berkenaan model terbitkan-langganan dalam Events, kita perlu terlebih dahulu memahami beberapa kaedah lazimnya.

  • Kaedah langganan : Kaedah on digunakan untuk melanggan kaedah peta Langganan ke dalam perhubungan satu dengan banyak.
  • Kaedah terbitan : emit digunakan untuk melaksanakan acara yang dilanggan.
  • Nyahlanggan: Kaedah off boleh mengalih keluar pendengar acara yang sepadan.
  • Langgan sekali : once Acara terikat akan memadamkan acara yang dilanggan secara automatik selepas pelaksanaan. Parameter pertama kaedah

dihidupkan dan dipancarkan

on digunakan untuk menetapkan nama kelas, dan parameter kedua juga merupakan fungsi, yang boleh Menerima parameter yang dihantar semasa menerbitkan. Parameter pertama kaedah

emit ialah nama kelas, dan parameter seterusnya ialah parameter yang dihantar ke dalam fungsi kaedah on.

on dan emit boleh merujuk kepada Demo mudah di bawah untuk aplikasi tertentu.

const EventEmitter = require('events');
// 自定义一个 构造函数
function Cat() {}
// 原型继承 需要通过实例来调用继承方法
Object.setPrototypeOf(Cat.prototype, EventEmitter.prototype);
let cat = new Cat();
const sleep = (a, b) => {
    console.log(a, '睡');
};
const eat = (a, b) => {
    console.log(b, '吃');
};
cat.on('猫咪', sleep)
cat.on('猫咪', eat)
setTimeout(() => {
  	// 小胡子 吃
  	// 小胖仙 睡
    cat.emit('猫咪', '小胖仙', '小胡子')
}, 1000);
Salin selepas log masuk

Kini kita boleh melaksanakan satu set kaedah on dan emit.

function EventEmitter() {
    this._event = {}
}
// on 方法
EventEmitter.prototype.on = function (eventName, callBack) {
    if (!this._event) {
        this._event = {}
    }
    if (this._event[eventName]) {
        this._event[eventName].push(callBack) // 相当于 {eventName:[fn1,fn2]}
    } else {
        this._event[eventName] = [callBack]; // 相当于 {eventName:[fn1]}
    }

}
// emit 方法
EventEmitter.prototype.emit = function (eventName, ...args) {
    this._event[eventName].forEach(fn => {
        fn(...args)
    });
}
Salin selepas log masuk

mati

off Parameter pertama kaedah digunakan untuk menetapkan nama kelas, dan parameter kedua diluluskan dalam fungsi yang memerlukan untuk dialih keluar panggilan balik.

// ...
setTimeout(() => {
  	// 小胡子 吃
  	// 小胖仙 睡
    cat.emit('猫咪', '小胖仙', '小胡子')
  	cat.off('猫咪', sleep);
  	// 小胡子 吃
    cat.emit('猫咪', '小胖仙', '小胡子')
}, 1000);
Salin selepas log masuk

Dengan cara ini kita boleh menilai secara kasar dan mengalih keluar fungsi yang sama seperti fungsi yang kita lalui. Kami dengan pantas memikirkan kaedah penapis.

// off 方法
EventEmitter.prototype.off = function (eventName, callBack) {
    if (this._event && this._event[eventName]) {
        this._event[eventName] = this._event[eventName].filter(
          fn => fn !== callBack && fn.c !== callBack // fn.c参考下面的once方法实现
        )
    }
}
Salin selepas log masuk

sekali

once Parameter pertama kaedah digunakan untuk menetapkan nama kelas, dan parameter kedua diluluskan dalam fungsi yang hanya perlu dilaksanakan sekali panggil balik.

// ...
const demolition =() => {
    console.log('拆家');
}
cat.once('猫咪', demolition)
setTimeout(() => {
  	// ...... 拆家
    cat.emit('猫咪', '小胖仙', '小胡子')
}, 1000);
Salin selepas log masuk

Dengan cara ini kita boleh melaksanakan kaedah ini berdasarkan on dan off yang telah dilaksanakan sebelum ini.

// once 方法
EventEmitter.prototype.once = function (eventName, callBack) {
    const one = () => {
        callBack();
        this.off(eventName, one);
    }
    this.on(eventName, one);
}
Salin selepas log masuk

Nampaknya tiada yang salah dengan kaedah ini, dan semuanya dilaksanakan dengan betul.

Tetapi dalam kes khas, ralat masih berlaku.

Situasi itu adalah jika kita telah mengeluarkannya melalui kaedah once sebelum melaksanakan kaedah off.

Kaedah yang kami laksanakan tidak dapat memenuhi keperluan ini, jadi kami masih perlu membuat beberapa pengubahsuaian pada once kaedah (kaedah off telah pun diproses) .

Tambahkan atribut tersuai pada "cache" fungsi.

EventEmitter.prototype.once = function (eventName, callBack) {
    const one = () => {
        // ...
    }
    one.c = callBack; // 自定义一个属性
    // ...
}
Salin selepas log masuk

Dengan cara ini kami melaksanakan kaedah once.

Untuk lebih banyak pengetahuan berkaitan nod, sila lawati: tutorial nodejs! !

Atas ialah kandungan terperinci Node.js belajar dan bersembang tentang modul Acara. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan