nodejs 011: nodejs事件驱动编程 EventEmitter 与 IPC

news2024/9/21 2:41:46
  • 在 Node.js 和许多 JavaScript 环境中,EventEmitter 是一个非常重要的类,用于处理事件驱动编程。EventEmitter 是一个能够发射(emit)和监听(on)事件的对象。它常用于创建和处理事件机制,使得程序中的不同部分能够相互通信。

示例代码

  • 假设有一个 FileManager 类,它继承自 EventEmitter,并在添加文件时发射一个事件:
const EventEmitter = require('events');

class FileManager extends EventEmitter {
  addFile(file) {
    // 文件添加逻辑
    console.log(`File added: ${file}`);
    
    // 发射事件
    this.emit('files-added', file);
  }
}

const fileManager = new FileManager();

// 监听 'files-added' 事件
fileManager.on('files-added', (file) => {
  console.log(`Listener received file: ${file}`);
});

// 添加文件,触发事件
fileManager.addFile('example.txt');
  • 在这个示例中,当 addFile 方法被调用时,它不仅会添加文件,还会发射一个 'files-added' 事件。注册到这个事件上的监听器会被触发,并处理相关的逻辑。
PS C:\Users\kingchuxing\Documents\ELECTRON\my-electron-app> node .\test.js
File added: example.txt
Listener received file: example.txt

用EventEmitter实现的库:menubar

  • menubar的官方实现代码及注释:
var menubar = new events.EventEmitter() // 创建一个新的 EventEmitter 实例,并赋值给变量 menubar
menubar.app = app // 将 app 对象赋值给 menubar 的 app 属性

if (app.isReady()) { // 检查应用程序是否已经准备好
  appReady()  // 如果应用程序已经准备好,调用 appReady 函数
} else {
  // 如果应用程序尚未准备好,注册一个监听器
  // 当应用程序发出 'ready' 事件时,调用 appReady 函数
  app.on('ready', appReady)
}

在这里插入图片描述

  • menubar的简单使用:
var menubar = require('menubar')

var mb = menubar()

mb.on('ready', function ready () {
  console.log('app is ready')
  // your app code here
})

使用EventEmitter的例子

  • Node.js的EventEmitter和IPC机制可以结合使用来实现跨进程的事件驱动通信。事件驱动模型可以帮助处理进程间传递的异步消息和事件,使得应用程序的设计更加灵活和响应迅速。
const {ipcMain} = require('electron'); // electron
const logger = require('electron-log'); // electron
const menubar = require('menubar'); // electron
const fs = require('fs-extra'); // 文件处理
// 事件驱动编程类
const MyEventEmitter = require('./classes/  MyEventEmitter.js');
// 资源地址
const { ICON_PATH,INDEX_PATH } = require('./respath');
// IPC(进程间通信)标签
// 与MyEventEmitter绑定的:this.emit(IPC_EVENT_STATE_CHANGE, this.**)
// 与前端ui绑定的:比如menu.append(new MenuItem({ label: 'Quit(界面显示项)', click: () => ipcRenderer.send(IPC_EVENT_QUIT_APP) }));
const {
    IPC_EVENT_STATE_CHANGE,IPC_EVENT_FILES_ADDED,
    IPC_EVENT_QUIT_APP,} = require('../ipds/constants');


const myEventEmitter = new MyEventEmitter();
const mb = menubar({
    icon: ICON_PATH,
    index: INDEX_PATH,// index.html的路径
    preloadWindow: true,
    alwaysOnTop: false,
    width: 350,
    height: 400,
});


// Menubar的IPC调用
mb.on('ready', () => {
    setTimeout(() => {mb.showWindow(); }, 1000); // 在显示窗口之前添加一个短暂的延迟(1 秒),可以避免这种闪烁或关闭现象。
});
mb.on('show', () => {
    logger.error('[ipcMain] show方法调用');
});

// yMEventEmitter的IPC调用
myEventEmitter.on(IPC_EVENT_STATE_CHANGE, () => {

});
myEventEmitter.on(IPC_EVENT_FILES_ADDED, () => {
    logger.info('[myEventEmitter] files-added');
});


// ipcMain:Inter Process (Main <-> Render) Communication
ipcMain.on(IPC_EVENT_QUIT_APP, () => {
    mb.app.quit();
    myEventEmitter.quit();
});

CG

  • 进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应用程序的关键部分。由于主进程和渲染进程在 Electron 的进程模型中具有不同的职责,因此 IPC 是执行许多常见任务的唯一方式,例如从 UI 调用本机 API 或从本机菜单触发 Web 内容的更改。
  • IPC 指 处理器间调用 (Inter-Processor Call),而不是其他操作系统中所指的 进程间通信 (Inter-Process Communication)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2146864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dubbo与SpringCloud的区别和优缺点

经常会有同学问我&#xff0c;Dubbo和SpringCloud的选择。甚至也经常会有面试官就这个问题刨根问底。 说实话&#xff0c;其实我不太喜欢回答这个问题&#xff0c;本质上来讲&#xff0c;Dubbo的SpringCloud可以算是完全不同赛道的两种东西&#xff0c;就好像问大家西瓜和土豆我…

【Java】多线程前置知识 初识Thread

多线程前置知识 & 初识Thread 冯诺依曼体系结构初步认识存储设备CPU指令 操作系统初识操作系统内核态和用户态 进程/任务进程是什么进程的管理进程的调度虚拟内存地址进程间的通信 线程线程的出现线程是什么线程可能出现的问题线程与进程的联系和区别 协程初识Thread类Thre…

VSCode引用Eigen库无法识别问题解决

VSCode引用Eigen库无法识别问题解决 问题解决 问题 在Ubuntu下使用vscode开发C/C项目时引用了Eigen库&#xff0c;出现Eigen::Vector3d无法识别的问题&#xff0c;提示"no definition found for Vector3d"。但是程序可以正常编译通过。 解决 将 intelli Sense Engi…

【学习资料】袋中共36个球,红白黑格12个,问能一次抽到3个红4个白5个黑的概率是多少?

1、公式计算 1.1 题目1 袋中共 36 36 36个球&#xff0c; 红 \fcolorbox{red}{#FADADE}{\color{red}{红}} 红​ 白 \fcolorbox{white}{#808080}{\color{white}{白}} 白​ 黑 \fcolorbox{#808080}{#0D0D0D}{\color{#808080}{黑}} 黑​各 12 12 12个&#xff0c;问能一次抽到 3…

事件循环异步代码输出顺序题目【基础考核】

简单的事件循环&#xff0c;一道异步代码执行输出顺序问题? 第一题 setTimeout(() > {console.log("A")Promise.resolve().then(() > { console.log("B"); });}, 1000);Promise.resolve().then(() > { console.log("c"); });new Prom…

JSON.parseArray 内存溢出

实际上我的JSON如下&#xff1a; 如果用以下代码&#xff1a;JVM的内存直接飙到内存溢出&#xff0c;报错OutOfMemoryError: Java heap space Object oo JSON.parseArray(json, TestVo.class) 如果我换成了这样&#xff0c;就没事&#xff1a; Object oo JSON.parseObject(…

1.2 测试基础

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 测试分类1.1 按生产阶段划分1.2 按代码可见度划分1.3 其他测试 2 质量模型 前言 在软件开发过程中&#xff0c;测试是确保产品质量的重要环节。本文详细讲解了软件测试分类以及…

Python Email库:发送与接收邮件完整指南!

Python Email库如何集成&#xff1f;怎么优化Python Email库性能&#xff1f; Python作为一种强大的编程语言&#xff0c;提供了丰富的库来处理电子邮件&#xff0c;其中最著名的就是Python Email库。AokSend将深入探讨如何使用Python Email库来发送和接收邮件&#xff0c;帮助…

SpringCloud config native 配置

SpringCloud config native 配置 1.概述 最近项目使用springCloud 框架&#xff0c;使用config搭建git作为配置中心。 在私有化部署中&#xff0c;出现很多比较麻烦的和鸡肋的设计。 每次部署都需要安装gitlab 有些环境安装完gitlab&#xff0c;外面不能访问&#xff0c;不给开…

适合运动的骨传导耳机哪款好?分享五款性能卓越骨传导耳机

面对琳琅满目的骨传导耳机市场&#xff0c;是不是既兴奋又迷茫&#xff1f;别怕&#xff0c;我来给你支几招&#xff01;选耳机&#xff0c;最重要的是适合自己&#xff0c;别被各种噱头和价格差异绕晕了头。价格高低与品质好坏并非绝对正比&#xff0c;关键看性价比和个人需求…

Google SERP API 对接说明

Google SERP API 对接说明 Google SERP&#xff08;Search Engine Results Page&#xff09;是用户在Google搜索引擎中输入查询后看到的结果页面。它显示自然搜索结果、广告、特色摘要、知识图谱以及图片、视频等多种内容&#xff0c;旨在为用户提供最相关的信息。 本文将详细…

物联网开发+充电桩管理系统+充电桩系统源码

简述 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5新能源汽车电动自行车公交车-四轮车充电充电源代码充电平台源码Java源码无加密项目 介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充…

鸿蒙应用生态构建的核心目标

保护开发者和用户利益的同时维护整体系统的安全性&#xff0c;对生态构建者是至关重要的。以开发者为中心&#xff0c;构建端到端应用安全能力&#xff0c;保护应用自身安全、运行时安全&#xff0c;保障开发者权益&#xff0c;是鸿蒙应用生态构建的核心目标。 应用生命周期主要…

大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

CAD图1

文章目录 选择直线工具选择圆形选中圆形 选择直线工具 画一条十字中心线 选择圆形 以十字中心为起点画一个半径为 53 的圆形 选中圆形 选中圆形&#xff0c;捕捉右侧圆形焦点

【北京迅为】《STM32MP157开发板使用手册》- 第四十章 二值信号量实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

②MODBUS TCP 转 RS485(RS485与TCP数据双向互传)MODBUS TCP与MODBUS RTU互转(无需编程 独立通道)

型号&#xff1a;1路总线TCP网关&#xff08;单网口&#xff09; MS-A1-5011 1路总线TCP网关&#xff08;双网口&#xff09; MS-A2-5011 2路总线TCP网关&#xff08;单网口&#xff09; MS-A1-5021 2路总线TCP网关&#xff08;双网口&#xff09; MS-A2-5021 4路总…

怎样把PPT上顽固的图标删了

例如&#xff1a; 解决&#xff1a; 首先打开下载好的PPT模板&#xff0c;然后在视图选项卡里面找到幻灯片母版。 进入幻灯片母版后&#xff0c;找到第一页母版页就会看到LOGO了&#xff0c;这时使用鼠标就可以选中删除啦。

【Web】从网安的角度浅聊Groovy命令执行

什么是 Groovy&#xff1f; Groovy 是一种基于 Java 平台的动态语言&#xff0c;旨在提高开发效率。它与 Java 语言高度兼容&#xff0c;允许开发者以更简洁的方式编写代码。Groovy 支持面向对象编程、闭包、DSL&#xff08;领域特定语言&#xff09;等特性&#xff0c;使得它…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(上)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案…