Promise 改造 child_process.exec
child_process 是 Node.js 的一个内建模块,用于分裂出(spawn)一个子进程,执行一些特定操作。.exec() 是它的方法,接受一个参数,即要执行的 shell 命令,然后通过回调返回结果。.exec() 与 .spawn() 的不同之处在于,前者重在返回结果,后者则重在返回内容。所以当你需要执行一个命令,你并不关心执行过程中发生了什么,只要看到结果就好,那么就用 .exec();反之,假如执行过程中产生的信息对你特别有价值,你并不是特别在意结果,就应该用 .spawn()。
另外,我之前在《Node.js 8 中的 util.promisify》中介绍过,Node.js 8 引入了一个新函数,位于 util 模块,叫做 promisify(),用于将回调风格的 Node.js 函数改造成 Promise 规范的函数。
OK,背景知识介绍结束。近期开发中,我需要执行一个命令,并且取得它的 stdout,stderr 和 exit code,使用 promisify() 之后发现没有 exit code,于是只好重新写了一下,代码如下:
import {exec as BaseExec} from 'util';
function exec(command, options) {
return new Promise((resolve, reject) => {
let result = {};
const cp = baseExec(command, options, (err, stdout, stderr) => {
if (err) {
err.stdout = stdout;
err.stderr = stderr;
reject(err);
return;
}
result.stdout = stdout;
result.stderr = stderr;
if ('code' in result) {
resolve(result);
}
});
cp.on('exit', (code, signal) => {
result.code = code;
result.signal = signal;
if ('stdout' in result) {
resolve(result);
}
});
});
}
希望对大家有用。
新键盘到了,FC660C,静电容,试用一下,效果还不错。略硬,段落感不强,声音不大。
相关文章
捕获 promisify `child_process.exec` 的错误
这个东西文档里没写清楚,所以写篇博客记一下。 在 Node.js 里,我们可以使用 child_process […]
2021-09-124 分钟
在 Code.fun 做 Code Review(三):聊聊 Promise 的错误处理、如何真正学到技术
嗯,不知不知觉这个系列写到第三篇,这一篇会改变一下写法,从一次 Code Review 出发,讲解几个技术点, […]
2022-08-2110 分钟
babel@6 升级到 babel@7,兼容性代码膨胀的原因
最近尝试把厂里项目的依赖从 babel@6 升级到 babel@7,发现打包之后体积大了很多。于是打开 web […]
2021-11-163 分钟


