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

使用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"}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值