等待 Node.js 中子进程的流输入

Waiting for stream input from child process in Node.js

我的主 Node.js 进程产生了一个子进程。我想通过其标准输入向子进程发送数据并从其标准输出中读取数据来与子进程进行通信。子进程将继续 运行。我想给它发送一条消息,然后等待它响应,对响应做一些事情,然后继续主流程。我如何最好地做到这一点?我尝试了以下方法:

    // I call this function after sending to child's stdin
    private async readWaitStream() {
        let data = '';

        let chunk = '';
        while (chunk = this._child.stdout.read()){
            data += chunk;
        }

        // doesn't finish because child process stays running
        await finished(this._child.stdout); 
        return data;
    }

子进程永远不会结束,这是行不通的。

只需监听 stdoutend 事件,然后 return 数据。你需要把它包装成一个 Promise。

  private async readWaitStream() {
    return new Promise((resolve) => {
      let data = '';

      this._child.stdout.on('readable', () => {
        let chunk = '';
        while (chunk = this._child.stdout.read()) {
          data += chunk;
        }
      });

      this._child.stdout.on('end', () => {
        resolve(data); // return data
      });
    });
  }

我想出了解决问题的方法。我使用once.('readable' ... ),例如:

private readWaitStream() {
    return new Promise(resolve => {
        let data = '';
        this._child.once('readable', () => {
            let chunk = '';
            while (chunk = this._child.read()) {
                data += chunk;
            }
            resolve(data);
        });
    });
}

当我 then 函数时,我们将等待输入,只有在下一个输入可用后,promise 才会解析。