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

Node.js belajar dan bersembang tentang modul Acara

青灯夜游
青灯夜游ke hadapan
2021-12-24 18:18:274336semak imbas

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);

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)
    });
}

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);

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方法实现
        )
    }
}

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);

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);
}

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; // 自定义一个属性
    // ...
}

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!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam