第26節 Node.js 事件

Node里很多對象會分發事件: 每次有連接的時候net.Server會分發事件,當文件打開的時候fs.readStream會分發事件。所有能分發事件的對象都是?events.EventEmitter的實例。通過require("events");能訪問這個模塊。

一般來說,事件名都遵照駝峰規則,但這不是強制規定,任何形式的字符串都可以做為事件名。

為了處理事件,通常將函數關聯到對象上。這些函數也叫監聽者(listeners)。在這個函數里,this指向監聽者所關聯的EventEmitter

類: events.EventEmitter

你可以通過require('events').EventEmitter獲取EventEmitter類。

EventEmitter實例遇到錯誤后,通常會觸發一個錯誤事件。錯誤事件在node里是特殊例子。如果沒有監聽者,默認的操作是打印一個堆棧信息并退出程序。

當添加新的監聽者時, EventEmitters會觸發'newListener'事件,當移除時會觸發'removeListener'

emitter.addListener(event, listener)

emitter.on(event, listener)

添加一個監聽者到特定event的監聽數組的尾部,觸發器不會檢查是否已經添加過這個監聽者。 多次調用相同的eventlistener將會導致listener添加多次。

server.on('connection', function (stream) {console.log('someone connected!');
});

返回emitter。

emitter.once(event, listener)

給事件添加一個一次性的listener,這個listener只會被觸發一次,之后就會被移除。

server.once('connection', function (stream) {console.log('Ah, we have our first user!');
});

返回emitter。

emitter.removeListener(event, listener)

從一個某個事件的listener數組中移除一個listener。注意,這個操作會改變listener數組內容的次序。

var callback = function(stream) {console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

removeListener最多會移除數組里的一個listener。如果多次添加同一個listener到數組,那就需要多次調用removeListener來移除每一個實例。

返回emitter。

emitter.removeAllListeners([event])

移除所有的listener,或者某個事件listener。最好不要移除全部listener,尤其是那些不是你傳入的(比如socket或文件流)。

返回emitter。

emitter.setMaxListeners(n)

默認情況下,給單個事件添加超過10個listener,事件分發器會打印警告。這樣有利于檢查內存泄露。不過不是所有的分發器都應該限制在10個,這個函數允許改變 listener數量,無論是0還是更多。

返回emitter。

EventEmitter.defaultMaxListeners

emitter.setMaxListeners(n)設置一個分發器的最大listener數,而這個函數會立即設置所有EventEmitter的當前值和默認值。要小心使用。

請注意,emitter.setMaxListeners(n)的優先級高于EventEmitter.defaultMaxListeners.

emitter.listeners(event)

用于返回事件的listener數組。

server.on('connection', function (stream) {console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection'))); // [ [Function] ]

emitter.emit(event[, arg1][, arg2][, ...])

允許你使用指定的參數順序的執行每一個listener.

如果事件有 listener,返回true, 否則false

類方法: EventEmitter.listenerCount(emitter, event)

返回指定事件的listener數量。

Event: 'newListener'

  • event{String}事件名
  • listener{Function}事件處理函數

添加listener的時候會觸發這個事件。當這個事件觸發的時候,listener可能還沒添加到listener數組。

Event: 'removeListener'

  • event{String}事件名
  • listener{Function}事件處理函數

刪除listener的時候會觸發這個事件。當這個事件觸發的時候,listener可能還還沒從listener數組移除。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83722.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83722.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LangChain + MCP + vLLM + Qwen3-32B 構建本地私有化智能體應用

一、私有化智能體應用 在本專欄的前面文章基于Spring AI MCP實現了本地 ChatBI 問答應用,本文還是依據該場景,采用 LangChain vLLM Qwen3-32B MCP 技術棧構建該流程,整體過程如下圖所示: 實現效果如下所示: 關于 M…

AKS升級路線最佳實踐方案

前言 Kubernetes 社區大約每 4 個月發布次要版本,次要版本包括新增功能和改進。補丁發布更為頻繁(有時每周都會發布),適用于次要版本中的關鍵 Bug 修復。修補程序版本包括針對安全漏洞或主要 bug 的修復。對于受支持版本列表以…

樹莓派智能小車基本移動實驗指導書

1.安裝LOBOROBOT庫函數 LOBOROBOT.py代碼如下: #!/usr/bin/python # -*- coding: utf-8 -*-import time import math import smbus import RPi.GPIO as GPIODir [forward,backward, ]class PCA9685:# Registers/etc.__SUBADR1 0x02__SUBADR2 …

如何對目標檢測算法RT-DETR進行創新和改進:突破瓶頸,提升性能!

更多精彩,詳見文末~~~ 在目標檢測的高速發展中,RT-DETR作為DETR(DEtection TRansformer)的高效變體,憑借其優異的性能和較快的推理速度,已經成為許多實際應用中的首選算法。然而,盡管RT-DETR在…

Java-String

前言 package com.kjxy.st;public class TestString1 {public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 new String("hello");String s4 new String("hello");System.out.println(s1 s2…

計算機組成原理——C/存儲系統

🌈個人主頁:慢了半拍 🔥 創作專欄:《史上最強算法分析》 | 《無味生》 |《史上最強C語言講解》 | 《史上最強C練習解析》|《史上最強C講解》|《史上最強計組》|《史上最強數據結構》 🏆我的格言:一切只是時…

什么是電輸運性能

電輸運性能?是指材料在電場作用下,電子在材料中傳輸的能力和效率。具體來說,電輸運性能包括以下幾個方面: ?電子的自由移動性?:導體中的電子具有較大的自由移動能力,這是由于導體中的原子或分子結構具有一定的松散…

k3s入門教程(二)部署前后端分離程序

文章目錄 部署基礎服務部署Redis部署MySQL端口轉發測試 運行與構建前后端鏡像構建后端鏡像 docker build -t ruoyi-admin:v3.8 .構建前端鏡像 docker build -t ruoyi-ui:v3.8 .創建私庫,推拉鏡像 前后端應用部署后端應用部署前端應用部署 啟動順序與初始化容器修改前…

Seata如何與Spring Cloud整合?

🔧 一、整合核心步驟 1. 啟動 Seata Server(TC) 環境準備: 修改 registry.conf,指定注冊中心(如 Nacos)和配置中心:registry {type "nacos"nacos {serverAddr "l…

Python惰性函數與技術總結-由Deepseek產生

在Python中,惰性(Lazy)技術指延遲計算直到真正需要結果時才執行,常用于優化內存和性能。以下是常見的惰性函數和技術: 1. 生成器(Generators) 原理:使用 yield 返回迭代結果&#x…

輪廓 裂縫修復 輪廓修復 填補孔洞 源代碼

目錄 1. 形態學閉合操作填補小孔洞 完整代碼: 使用 Douglas-Peucker 算法對輪廓進行多邊形逼近 2.裂縫修復 輪廓修復 輪廓補全 函數封裝 調用示例: 1. 形態學閉合操作填補小孔洞 完整代碼: import cv2 import numpy as np# 創建模擬圖像(白色區域 + 多個不規則黑洞)…

HTTP1.1

HTTP基礎知識 HTTP(HyperText Transfer Protocol)是用于傳輸超文本 的應用層協議,采用客戶端-服務器 模型。 客戶端(如瀏覽器)發起請求,服務器響應并返回數據。 工作原理 客戶端發送HTTP請求至服…

【Linux教程】Linux 生存指南:掌握常用命令,避開致命誤操作

Linux 常用操作命令:避免誤操作指南 在 Linux 系統中,熟練掌握常用操作命令是高效工作的基礎,但同時也要警惕誤操作帶來的風險。無論是部署程序、配置防火墻、管理端口還是處理進程,一個小小的失誤都可能導致系統故障、數據丟失等…

PHP:Web 開發領域的常青樹

在當今數字化浪潮中,Web 開發技術日新月異,各種新興語言和框架層出不窮。然而,PHP 作為一門經典的后端開發語言,依然在 Web 開發領域占據著重要地位,展現出強大的生命力和廣泛的應用價值。 PHP 的歷史與現狀 PHP&…

平均數與倍數

目錄 一. 平均數現期平均數基期平均數(比較冷門)兩期平均數-比較平均數的增長量平均數的增長率 二. 倍數基期倍數 \quad 一. 平均數 \quad 現期平均數 \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad 平均數速算技巧:削峰填谷…

一個完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (三)

現在我們主要完成AI-RAG服務的擴展,利用ES的向量檢索能力完成歷史聊天記錄的存儲和向量檢索,讓ai聊天有記憶。 主要做法是在首次聊天完成后將對話內容寫出日志到D:\dev\dev2025\EC0601\logs\chat-his.log 寫出日志同時嵌入向量 向量可以從ollama的端點&…

Vue嵌套(多級)路由

一、前言 在構建中大型單頁應用(SPA)時,頁面結構往往比較復雜,比如儀表盤、用戶中心、商品管理等模塊通常包含多個子功能頁面。為了更好地組織這些頁面,Vue Router 提供了嵌套(多級)路由的功能。 通過嵌套路由,我們可以在父級組件中嵌入一個 <router-view> 來展…

Kubernetes 集群安全(身份認證機制、SecurityContext、Network Policy網絡策略、預防配置泄露、全面加固集群安全)

Kubernetes 集群安全(身份認證機制、SecurityContext、Network Policy網絡策略、預防配置泄露、全面加固集群安全) 一、Kubernetes 身份認證機制 身份認證(Authentication): 在 K8S 中,身份認證是安全訪問控制的第一道大門,它的目標是: 確認請求發起者的真實身份 K8…

【VUE3】基于Vue3和Element Plus的遞歸組件實現多級導航欄

文章目錄 前言一、遞歸的意義二、遞歸組件的實現——基于element-plus UI的多級導航欄2.1 element-plus Menu菜單官方示例2.2 接口定義2.3 組件遞歸2.4 父組件封裝遞歸組件 三、完整代碼——基于element-plus UI的多級導航欄3.1 組件架構3.2 types.ts3.3 menuTreeItem.vue3.4 i…

思科資料-ACL的基礎配置-詳細總結

一、ACL技術 1、定義 訪問控制列表訪問控制列表使用包過濾技術&#xff0c;在路由器上讀取第三層及第四層包頭中的信息如源地址&#xff0c;目的地址&#xff0c;源端口&#xff0c;目的端口等&#xff0c;根據預先定 義好的規則對包進行過濾&#xff0c;從而達到訪問控制的目…