当前位置: 首页 > news >正文

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

  • 在 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)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SLA 概念和计算方法
  • 智慧课堂学生行为数据集
  • AI预测福彩3D采取888=3策略+和值012路或胆码测试9月19日新模型预测第92弹
  • 基于深度学习的零售柜商品识别系统实战思路
  • Vue2篇
  • 【60天备战2024年11月软考高级系统架构设计师——第21天:系统架构设计原则——高内聚低耦合】
  • C++实现的小游戏
  • watch和computed的使用及区别
  • Unity3D 小案例 像素贪吃蛇 02 蛇的觅食
  • 数据增强又突破了!升级版“双杀”两大顶会,实现无痛涨点
  • Mybatis批量操作
  • CISP备考题库(八)
  • JavaScript match() 方法
  • 如何在Android上实现RTSP服务器
  • 【案例71】配置https之后 IE打不开登陆页面 Uclient没有问题
  • CEF与代理
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ECS应用管理最佳实践
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Git 使用集
  • Git的一些常用操作
  • JS 面试题总结
  • MobX
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Sass 快速入门教程
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 闭包--闭包作用之保存(一)
  • 从0到1:PostCSS 插件开发最佳实践
  • 给第三方使用接口的 URL 签名实现
  • 前端知识点整理(待续)
  • 如何利用MongoDB打造TOP榜小程序
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 原生Ajax
  • ​iOS安全加固方法及实现
  • # 计算机视觉入门
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)Android开发优化---------UI优化
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (二)fiber的基本认识
  • (六)c52学习之旅-独立按键
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (一) storm的集群安装与配置
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • *p++,*(p++),*++p,(*p)++区别?
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .bat批处理(一):@echo off
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core 将实体类转换为 SQL(ORM 映射)