2 回答
TA贡献1828条经验 获得超13个赞
data流上的事件零保证整个“单元”输出将在一个data事件中聚集在一起。它可以很容易地分解为多个data事件。因此,这与您提供生成多个输出的多个输入这一事实相结合,这意味着您需要一种方法来解析当您拥有一组完整的输出时,因此应该使用它调用回调以及如何划定两者之间的界限套输出。
您没有向我们展示您的输出是什么样子,因此我们无法就如何以这种方式解析它提供任何具体建议,但常见的定界符是这样的双换行符。这完全取决于您的输出最终自然会做什么,或者您是否控制子进程创建的内容,您可以在输出末尾插入什么。
合并输出的另一种解决方法是在第一个命令完成之前不发送第二个命令(可能通过使用某种挂起队列)。但是,您仍然需要一种方法来解析输出,以了解您何时真正完成了前一个输出。
另一个问题:
在您显示的代码中,每次调用 时,您都会为该事件writeCommand()添加另一个侦听器。data因此,当您调用它两次以发送不同的命令时,您现在将有两个侦听器都在侦听相同的data内容,并且您将处理相同的响应两次而不是一次。
let command = spawn('vlc', { shell: true });
writeCommand(cmd, callback) {
process.stdin.write(`${cmd}\n`);
this.isBusy = true;
// every time writeCommand is called, it adds yet another listener
this.process.stdout.on('data', (d) => {
callback(d);
});
}
如果您真的打算多次调用它并且多个命令可能同时“进行中”,那么您真的不能使用这种编码结构。对于此函数之外的事件,您可能需要一个永久侦听器,data因为您不希望同时拥有多个侦听器,而且您已经发现可以合并来自两个命令的数据,即使如果将它们分开,则不能使用此结构为合并输出的第二部分适当地捕获数据。
TA贡献1786条经验 获得超11个赞
添加回答
举报