【Electron-vue】构建桌面应用(30)- child_proccess多次输出结果

2023-11-07

使用child_process启动子进程,并与子进程通信的时候,发现会有多条打印结果,其原因是:不同的操作会触发stdin.write操作,而每一个操作都需要通过stdout.on来监听返回结果,如果使用stdout.on来监听返回结果,那么会一直处于监听状态。导致在其他操作进行stdin.write进行写操作的时候,也会被其他的stdout.on监听到。导致输出多条数据

代码:

// 钉钉扫码事件
ipcMain.on("ddcode", (event, args) => {
  args.port += ""
  let cmdStr = '' + JSON.stringify(args) + ''
  log.info("钉钉扫码登陆参数:", cmdStr)
  child.stdin.write(cmdStr + '\n')
  child.stdout.on('data', (data) => {
    log.info("钉钉扫码登陆结果:", returnString(data))
    logintype = "other"
    event.sender.send('ddlogin-result', returnString(data))
  })
})

比如我以此进行了登陆操作,钉钉扫码操作,以及退出操作,那么当我进行最后的退出操作时,返回的的结果就会是这样的:

[2021-05-28 16:43:45.057] [info] 启动服务: {"msg":"登出成功","type":"0"}


[2021-05-28 16:43:45.058] [info] 获取钉钉apikey和redirect url结果: {"msg":"登出成功","type":"0"}


[2021-05-28 16:43:45.059] [info] 钉钉扫码登陆结果: {"msg":"登出成功","type":"0"}


[2021-05-28 16:43:45.060] [info] 注销账户结果: {"msg":"登出成功","type":"0"}


[2021-05-28 16:47:11.915] [info] 启动服务: {"msg":"启动正常","type":"0"}

可以看出打印了五条退出的信息,这就导致日志文件成倍的增加,这是一种错误的做法。

正确的做法,应该将stdout.on改为stdout.once,意思是只进行以此监听输出结果,就是针对每一个操作进行一次结果监听。

// 钉钉扫码事件
ipcMain.on("ddcode", (event, args) => {
  args.port += ""
  let cmdStr = '' + JSON.stringify(args) + ''
  log.info("钉钉扫码登陆参数:", cmdStr)
  child.stdin.write(cmdStr + '\n')
  child.stdout.once('data', (data) => {
    log.info("钉钉扫码登陆结果:", returnString(data))
    logintype = "other"
    event.sender.send('ddlogin-result', returnString(data))
  })
})

那么我再次以此执行上面的操作,就只会打印一次输出结果:

[2021-05-28 16:48:44.603] [info] 钉钉扫码登陆参数: {"address":"192.168.0.116","auth":"dingding","port":"10000","type":"login","username":"ed39499295a135dfb2bbe4bcd46bc120"}
[2021-05-28 16:48:44.752] [info] 钉钉扫码登陆结果: {"msg":"登录成功","pwdinit":"false","time":"2021-05-28 16:48:44","type":"0","username":"陈青坤"}


[2021-05-28 16:48:53.273] [info] 注销账户结果: {"msg":"登出成功","type":"0"}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Electron-vue】构建桌面应用(30)- child_proccess多次输出结果 的相关文章

随机推荐

  • cout保留两位小数

    cout保留两位小数 include
  • 简单方便的 JavaScript 逆向辅助模拟方法

    这是 进击的Coder 的第 419 篇技术分享 作者 崔庆才 来源 崔庆才丨静觅 阅读本文大概需要 3 分钟 在 JavaScript 逆向过程中 我们可能找到了一些入口 但是深入追踪下去 就发现这个过程过于复杂 调用层级越来越深 最终很
  • Obsidian 编译第三方插件

    起因 obsidian spaced repetition 是Obsidian 间隔重复插件 它可以帮助你定期复习自建的知识卡片 但功能上不是很全面 碰巧看到 Felix Luo 维护的obsidian spaced repetition插
  • 一分钟教你看懂蓝屏代码,轻松解决电脑蓝屏问题

    微软为了我们电脑中的资料安全可以说煞费苦心设计了很多有效的防护机制 其中蓝屏就是一个很好的给保护机制 接下来小编就提供一些经常出现的电脑蓝屏代码给大家 电脑蓝屏问题可以说只要使用过电脑朋友都遇到过 导致电脑蓝屏的原因有很多种 所有蓝屏代码也
  • 基于SM2密码算法的环签名方案的研究与设计

    摘要 环签名算法种类很多 大多数算法设计基于双线性对或大素数难分解 在安全性和运算速度方面有待提高 与基于椭圆曲线离散对数相比 双线性对的优势并不明显 因为它无法运用一样长度的密钥提供同样的安全性能 为了能够提升方案的安全性以及能够保证签名
  • JDK源码系列 & JAVA语言数据类型Byte

    目录 类的继承结构图 类的Diagram图 类 类的注释 源码分析 全局变量 静态内部类 构造方法 静态方法 parseByte 静态方法 valueOf 静态方法 toString 静态方法 hashCode 静态方法 decode 静态
  • 简述osi参考模型各层主要功能_OSI与TCP/IP简述

    OSI与TCP IP 二者区别 OSI参考模型定义计算机通信每层的功能 不是协议 TCP IP协议是具体的协议 实现了OSI参考模型规定的功能 参考下图 OSI参考模型每层功能 应用层 根据互联网中需要通信的应用程序的功能 定义客户端和服务
  • Android 显示提示框

    本文档为个人博客文档系统的备份版本 作者 小游 作者博客 点击访问 代码如下 Toast makeText context things happened Toast LENGTH SHORT show
  • go 命名与包;关于 ++/--;接收键盘输入/终端输入;switch;for 循环;函数;init 函数;匿名函数;闭包;defer;时间日期;内置函数;defer+recover 机制处理错误

    文章目录 命名与包 关于 接收键盘输入 终端输入 switch for 循环 函数 init 函数 匿名函数 闭包 defer 时间日期 内置函数 defer recover 机制处理错误 数组 代码 输出 命名与包 关于 接收键盘输入 终
  • drawio界面自定义配置

    1 适用的 drawio 版本 单机版 drawio 带有配置选项的单机版本 2 配置使用方法 点击配置 将json代码复制到弹窗中 点击应用即可 如果代码有错误 将无法应用 3 相关json代码 官方json配置参考 https www
  • Internet Download Manager2023最好用的HTTP下载神器

    Internet Download Manager 介绍2023最佳下载利器 Internet Download Manager 简称IDM 是一款Windows 平台功能强大的多线程下载工具 国外非常受欢迎 支持断点续传 支持嗅探视频音频
  • 一个 Go 开发的快速、简洁、美观、前后端分离的个人博客系统

    大家好 我是你们的章鱼猫 我们从来不含糊说推荐就推荐 所以今天给大家推荐一个 go echo vue 开发的快速 简洁 美观 前后端分离的个人博客系统 blog 同时基于这个系统也可以方便二次开发为 CMS 内容管理系统 和各种企业门户网站
  • 嵌入式 - UART使用进阶

    UART Advanced Features 概要 Overview 最简单直接的使用UART接口的方式 是在轮循操作中来设置和处理UART接口 轮询式UART的问题是轮询方式本身就是低效率的 如果我们的UART被配置为115200的波特率
  • vue踩坑之H5页面在ios的webview里面,长时间放到后台按钮失灵

    使用的前端技术栈是vue2 运行环境是在webview里面 具体的现象 在ios真机中 如果应用在后台运行几分钟再切回去 页面中的所有跳转按钮会失灵 并且报以下图片显示的错误 chunk是build之后的文件 从报错的信息来看是打包的某些文
  • 深入Java微服务之网关系列2:常见Java网关实现方案对比

    什么是服务网关 前文我们已经了解了构建微服务的基础springboot 同时也能使用springboot构建服务 接下来我们就基于springboot聊一下springcloud 这个springcloud并不是一个特定的技术 它指的是微服
  • this关键字和super关键字异同

    this关键字 1 在同一类中成员变量和局部变量名称相同时 区分两者和调用成员变量解决两者冲突问题 2 同一类中调用调用构造方法 3 指明成员方法 super关键字 1 在父类和子类中有相同变量时 调用父类变量 2 调用父类构造方法 必须放
  • 国内时间同步 ntp服务器地址

    国内时间同步 ntp服务器地址 ntp sjtu edu cn 202 120 2 101 上海交通大学网络中心NTP服务器地址 s1a time edu cn 北京邮电大学 s1b time edu cn 清华大学 s1c time ed
  • mysql8安装和驱动jar包下载

    方式一 基于docker安装 下拉镜像 docker pull mysql 8 0 21 启动镜像 docker run p 3307 3306 name mysql e MYSQL ROOT PASSWORD hadoop d mysql
  • 路由ui-router

    路由ui router Angular ngRoute针对于单视图 而ui router可用于多视图 这里说的视图是指在页面内我们可控制的 可变化的区域 比如我们点击了一个link 我们需要在视图中跳转到指定的一个页面 那么ngRoute已
  • 【Electron-vue】构建桌面应用(30)- child_proccess多次输出结果

    使用child process启动子进程 并与子进程通信的时候 发现会有多条打印结果 其原因是 不同的操作会触发stdin write操作 而每一个操作都需要通过stdout on来监听返回结果 如果使用stdout on来监听返回结果 那