猿问

如何延迟函数调用,直到它的回调在其他地方完成

我正在使用child_process将命令写入控制台,然后订阅'data'事件以从中获取输出。问题是有时输出会相互合并。


let command = spawn('vlc', { shell: true });


writeCommand(cmd, callback) {

  process.stdin.write(`${cmd}\n`);

  this.isBusy = true;

  this.process.stdout.on('data', (d) => {

    callback(d);

  });

}

函数writeCommand在多个地方使用,我怎样才能延迟它的执行,直到上一个命令的输出完成?


我的输出可能看起来像(status例如命令):


(音量:230)(状态停止)>


慕雪6442864
浏览 116回答 2
2回答

慕田峪7331174

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因为您不希望同时拥有多个侦听器,而且您已经发现可以合并来自两个命令的数据,即使如果将它们分开,则不能使用此结构为合并输出的第二部分适当地捕获数据。

Qyouu

您可以使用排队机制在第一个命令完成后执行下一个命令。你也可以使用像https://www.npmjs.com/package/p-limit这样的库来为你做这件事。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答