我正在node.js中生成一个子进程,如下所示:
const fs = require('fs');
fs.watch(filename, () => {
const ls = spawn('ls', ['-l', '-h', filename]);
let output = '';
/* ... data event which collects the data */
ls.on('close', () => {
const parts = output.split(/\s+/);
console.log([parts[0], parts[4], parts[8]]);
});
}
现在什么时候才生成子进程ls
?从node.js文档中,我可以看到它是以非阻塞方式异步生成的,因此我想它是立即生成的,而node.js继续处理当前的事件循环消息。但这不是暗示比赛条件吗?如果子进程在附加处理程序之前退出,会发生什么情况?如果我用setTimeout
包装处理程序,它将停止工作:
// ...
setTimeout(() => {
/* ... data event which collects the data */
ls.on('close', () => {
const parts = output.split(/\s+/);
console.log([parts[0], parts[4], parts[8]]);
});
}, 500);
// ...
所以我认为这不起作用的原因是您无法从封闭的流中读取内容。那是对的吗?
如果是这样,我怎么能相信我的数据收集处理程序在为时已晚之前被附加?
一旦(缓冲的)数据从stdout
中的ls
被关闭,是否更有意义?我在这里完全错过了什么吗?
感谢您的帮助。