node创建子进程启动应用,怎么发送成功启动应用的信息?

作者站长头像
站长
· 阅读数 14

问题描述

我想使用node创建一个子进程用来启动应用,我使用了child_process里面的内置模块spawn,它有有关错误的监听事件,可以捕捉到错误,只有在发生错误的时候才会执行。可是我如何监听这个应用启动成功呢?

相关代码

我写了一个promise来返回相关的信息

const promise = (url)=> {
    return new Promise((resolve, reject) => {
        const res =  spawn("cmd.exe", ['/s','/c', url])
        res.stderr.on('data', function(data) {
            data += data.toString()
            console.log('stderr',data)
            reject ({msg:"open failed",pid:res.pid,code:1});
        });

        res.on('error',(err)=>{
            console.log('res on err')
            reject ({msg:"open failed",pid:res.pid,code:1});
        });

        res.on("exit",(code,signal)=>{
            console.log("子进程退出"+code,signal)
            process.send({msg:"exit success",code:childCode.exit})
        })

        resolve( {msg:"open success",code:childCode.running,pid:res.pid})
    })
}

但是我发现监听事件是异步的,所以每次promise的状态都会变成fulfilled,错误信息无法捕捉到,我应该怎么实现只有正确的时候才去resolve呢,或者有什么更好的方法能返回启动错误或正确的信息呢?

回复
1个回答
avatar
test
2024-07-18

子进程在运行起来之后,没有结束之前,只要不出错,你都只能当它在正常运行。所以在这期间不应该有 resolve。只有在程序结束的时候 resolve,表示程序已经结束。

如果发生错误的时候 reject,没有问题,一般错误会导致程序结束。

在捕捉到 stderr 的时候处理错误本身没有问题,但是 reject 就有问题了。因为有错误输出不一定会导致进程结束,如果这里就 reject 了,那么后续的错误消息该怎么办呢?如果确实这里需要 reject,理论上来说,也应该同时停止进程。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容