Node.js:子进程执行的标准输出为对象值

3

我是新手Node开发者,对于其中的非阻塞元素感到有些困惑。我尝试创建一个对象,并使其中一个元素成为一个函数,该函数返回child_process.exec的stdout,代码如下:

var exec = require('child_process').exec;
var myObj = {};

myObj.list = function(){
  var result;
  exec("ls -al", function (error, stdout, stderr) {
     result = stdout;
  });
  return result;
}
console.log('Ta da : '+myObj.list);

我猜想myObj.list在设置为stdout之前就返回了result,但我不知道如何使其等待或进行回调。感谢您的帮助!

1个回答

4

由于该值在一段时间内不可用,因此您无法直接返回该值。因此,您需要使用回调函数来代替返回值,这意味着需要稍微改变调用代码的结构。

var exec = require('child_process').exec;
var myObj = {};

myObj.list = function(callback){
  var result;
  exec("ls -al", function (error, stdout, stderr) {
     callback(stdout);
  });
  // No return at all!
}
// Instead of taking a return we pass a callback
// which receives the value and carries on our computation.
myObj.list(function (stdout) {
   console.log('Ta da : '+ stdout);
});

在实际代码中,您可能希望将错误作为回调的第一个参数传递,这并非必须,但在Node.JS中这是正常的做法。


1
你是个明星,谢谢!我特别感激你的解释,现在我有了更好的理解! - DexCurl
@DexCurl,我该如何执行“不仅读取结果”的命令,例如Windows中的“exit”? - Muath
我需要一个同步调用(不会反转调用者的逻辑流):等待是可以的(事实上是必须的)。这里有什么选项吗? - WestCoastProjects

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接