微信号:gh_bd8d6a989787

介绍:介绍各种前端技巧,帮助提高前端开发的速度,逐渐做到分分钟完成开发.

在 Node.js 中使用子进程的 stdout 和 stdin

2019-03-28 08:30 web前端程序员

在这篇博文中, 我们在 Node.js 中像子进程那样运行 shell 命令. 然后我们用 async 语言特性去读取这些进程的 stdouts 并写入它们的 stdins.

在子进程中运行命令

让我们开始在一个子进程中运行一个 shell 命令:

评述:

  • 我们正在使用 spawn(), 因为, 稍后,在它运行的时候, 它让我们访问命令的 stdin, stdout 和 stderr.

  • 在 A 行, 我们正在把子进程的 stdin 连接到当前进程的 stdin (等等).

  • 在 B 行, 我们在等待该进程完全结束.

通过一个 Promise 等待一个子进程退出

函数 onExit() 如下所示.

子进程的 Promisified 写入

下面的代码使用 @rauschma/stringio 向一个正在运行 shell 命令的子进程的 stdin 异步写入:

我们为 shell 命令产生一个单独的进程, 称为 sink. writeToWritable 写入 sink.stdin. 它是异步的,并通过 await 暂停,以避免需要太多的缓冲.

评述:

  • 在A行, 我们告知 spawn() 让我们通过 sink.stdin ("pipe") 访问 stdin. 和前面一样,stdout 和 stderr 被转发到 process.stdinprocess.stderr.

  • 我们没有在B行 await 写入的结束. 相反, 我们 await 直到 sink 子进程完成.

继续阅读 streamWrite() 如何工作的一个解释.

流的 Promisified 写入

写入 Node.js 流通常涉及回调 (看文档). 它可被 promisified 如下.

streamEnd() 类似工作.

从一个子进程读取

下面代码使用异步迭代 (C 行) 从子进程的 stdout读取内容:

评述:

  • A 行: 我们忽略 stdin, 想通过流访问 stdout 并转发 stderr 到 process.stderr.

  • B 行: 我们 await 直到 echoReadable() 彻底完成. 没有这个 await, DONE 将在 source.stdout的第一行之前被打印.

在子进程之间的管道

在下面的例子中, 函数 transform():

  • 从一个 source子进程的 stdout 读取内容.

  • 向一个 sink 子进程的 stdin 写入内容.

换句话说, 我们正在实现类似于 Unix 管道的东西:

cat someFile.txt | transform() | cat

这是代码:

进一步阅读

  • 博文 “Reading streams via async iteration in Node.js”

  • “Exploring ES2018 and ES2019” 中的  “Asynchronous iteration” 章节

  • “Exploring ES2016 and ES2017” 中的 “Async functions” 章节


英文原文:http://2ality.com/2018/05/child-process-streams.html
译者:青书


 
web前端程序员 更多文章 200元任务,来赚! ES6的10个重要特性(含使用范例) 在浏览器中运行VSCode:code-server 15分钟学会Webpack 用web audio api重现经典8-bit音乐
猜您喜欢 知识点归纳(5) 人工智能风口只有2%的人能够成为赢家!——CSDN蒋涛 IPv6-only 的兼容性解决方案 如何让IT部门成为企业的价值中心 Nginx 动态发现方案与实践