node.js - 一旦标准输出停止发出东西,如何返回子进程
问题描述
我必须使用节点创建一个 tomcat 服务器,我知道,这有点奇怪,但它是出于学习目的。所以,基本上,我有shelljs
用于生成服务器的功能:
function spawnTomCat() {
return new Promise((resolve, reject) => {
const child = shell.exec('create server', {
async: true
})
child.stdout.on('data', data => {
// this is called several times, and I want to resolve the promise in the last
// call.
if (lastCall()) {
resolve(child)
}
})
child.stderr.once('data', reject)
})
}
基本上,因为它是一个服务器,所以child.on('close')
永远不会被调用,如果我resolve
在第一次执行child.stdout.on('data')
回调时调用该函数,服务器将启动。我可以粘贴我尝试过的东西,但它们都没有真正起作用,但我试图:
- 使用 exec - 回调永远不会被触发
- 使用同步 - 将阻塞并且不会执行进一步的代码
先感谢您。
解决方案
好的,所以您想在服务器启动并运行时进行解析。我真的只有两种方法可以知道这一点。
1. 让服务器告诉你。 当服务器认为它已启动并运行并准备好接受请求时,服务器会将一些已知数据写入标准输出(或其他通信通道),以便您可以监视该通道并知道何时可以使用。
2. 你轮询服务器。 您发送测试请求以了解它何时正确响应一些简单的请求。
监视标准输出数据暂停的计时器是一种黑客行为,并且有各种出错的机会。
推荐阅读
- java - Json 有效负载为空,而 xml 对 Spring MVC 项目工作正常
- database - 持久化由 @SecondaryTable 映射的字段
- postgresql - Psql 无法从 bash 调用过程
- python - 如何在 Python 中使用 ArgumentParser 转换两个参数?
- typescript - 为 Typescript React Native 功能组件创建 Promise
- javascript - 应用动态项目样式来响应 FullCalender
- webdav - WebDAV SEARCH:如何找到仲裁者 URL?
- python - 如何在数据库事务中包装 pytest?
- reactjs - React 单元测试:Tepeerror:data.filter 不是函数
- java - Iterating arraylist until find an specific character and stop the iteration