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

问题描述

我想使用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.5k
2 个回答

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

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

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

监听子进程的输出, 程序有它自己表示启动成功的一些特定输出. 如果是通过判断stderr有没有输出, 这个完全不靠谱.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏