我正在尝试将此函数的输出作为字符串返回,但它仍然以未定义的形式返回。我哪里错了?
function run(cmd){
var spawn = require('child_process').spawn;
var command = spawn(cmd);
var result = '';
command.stdout.on('data', function(data) {
result += data.toString();
});
command.on('close', function(code) {
return result;
});
}
console.log(run('ls'));
答案 0 :(得分:35)
您的函数在command.on
语句后立即返回。 return
事件的回调中的close
语句将返回到无处。 return
属于事件回调,而不属于run()
。
调用console.log
来代替return result
。
一般来说,你应该写一些类似的东西:
function run(cmd, callback) {
var spawn = require('child_process').spawn;
var command = spawn(cmd);
var result = '';
command.stdout.on('data', function(data) {
result += data.toString();
});
command.on('close', function(code) {
return callback(result);
});
}
run("ls", function(result) { console.log(result) });
答案 1 :(得分:5)
var spawn = require('child_process').spawn,
command = spawn('ls', ['/tmp/']);
command.stdout.pipe(process.stdout);
以下link与您的问题完全相同。
答案 2 :(得分:1)
您始终可以将函数包装在promise中并返回。我发现比@fuwaneko的回调解决方案更有效
function run(cmd) {
return new Promise((resolve, reject) => {
var spawn = require('child_process').spawn;
var command = spawn(cmd)
var result = ''
command.stdout.on('data', function(data) {
result += data.toString()
})
command.on('close', function(code) {
resolve(result)
})
command.on('error', function(err) { reject(err) })
})
}