【发布时间】:2015-08-26 03:03:57
【问题描述】:
我正在使用 Node.js 下的 Bluebird Promise 库,非常棒!但我有一个问题:
如果您查看 Node 的 child_process.exec 和 child_process.execFile 的文档,您会发现这两个函数都返回一个 ChildProcess 对象。
那么推荐的方法是什么?
请注意以下工作(我得到一个 Promise 对象):
var Promise = require('bluebird');
var execAsync = Promise.promisify(require('child_process').exec);
var execFileAsync = Promise.promisify(require('child_process').execFile);
但是如何才能访问原始 Node.js 函数的原始返回值呢? (在这些情况下,我需要能够访问最初返回的 ChildProcess 对象。)
任何建议将不胜感激!
编辑:
这是一个使用 child_process.exec 函数返回值的示例代码:
var exec = require('child_process').exec;
var child = exec('node ./commands/server.js');
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
child.stderr.on('data', function(data) {
console.log('stderr: ' + data);
});
child.on('close', function(code) {
console.log('closing code: ' + code);
});
但如果我使用 exec 函数的承诺版本(上面的 execAsync),那么返回值将是一个承诺,而不是 ChildProcess 对象。这才是我要说的真正问题。
【问题讨论】:
-
你需要promise和
ChildProcess实例吗?您希望如何使用所需功能的代码示例会很有帮助。 -
@Bergi 是的,完全正确!我将需要承诺和子进程对象。这更像是一个理论问题,因为我解决了我的问题。但这是我想做的:我想用 child_process.execFile 执行一个程序,然后我想将数据输入(管道)到它的标准输入并读取它的标准输出。我需要一个承诺,因为承诺链。无论如何,我通过承诺 child_process.exec 而不是 execFile 来解决它,并通过这样的 shell 运行程序:
prg <input >output。但现在我必须对所有内容进行 shell 转义(在 Windows 和 *nix 上)... -
如果你只是想访问stdout/err,你不需要返回的对象。因为 stdout/err 是回调函数的参数。
-
或者你可能喜欢github.com/jcoreio/promisify-child-process的API,它可以让你简单地
const {stdout, stderr} = await exec('echo test')
标签: javascript node.js promise bluebird