问题描述
我想使用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呢,或者有什么更好的方法能返回启动错误或正确的信息呢?
子进程在运行起来之后,没有结束之前,只要不出错,你都只能当它在正常运行。所以在这期间不应该有 resolve。只有在程序结束的时候 resolve,表示程序已经结束。
如果发生错误的时候 reject,没有问题,一般错误会导致程序结束。
在捕捉到 stderr 的时候处理错误本身没有问题,但是 reject 就有问题了。因为有错误输出不一定会导致进程结束,如果这里就 reject 了,那么后续的错误消息该怎么办呢?如果确实这里需要 reject,理论上来说,也应该同时停止进程。