关于 child_process 执行shell命令后返回值问题
发布于 7个月前 作者 liangguohuan 497 次浏览

执行文件:test.js

var exec = require('./exec');
var x = exec.getData('http://www.google.com.hk');
console.log('获取的返回值: ' + x);

模块:exec.js

var str = '1';

exports.getData = function(pstr) {
  var exec = require('child_process').exec,
      last = exec('exec.php ' + pstr);

  last.stdout.on('data', function(data) {
    console.log('标准输出:' + data);
    console.log('in:' + str);
    str = data;
    console.log('inlast:' + str);
  });

  console.log('return:' + str);

  return str;
}

执行结果:

return:1
获取的返回值: 1
标准输出:6543239631626496764
in:1
inlast:6543239631626496764

想解决问题: 怎样取得 str 变量经过 last.stdout.on 赋值后的返回值,希望执行文件test.js的输出是:获取的返回值:6543239631626496764

8 回复

last.stdout.on是异步返回的,所以你用同步的方法return一个值是拿不到东西的,你也改成异步返回就行了

@amoa400 我明白是last.stdout.on是异步返回的,看打印结果就可以看出,就是不知道应该如何进行处理才能正常返回,曾想用 async 包来解决,但是不知道应该怎么进行包装,可能对 async 还不够了解。

getData加一个回调函数来处理

@liangguohuan async库的确可以,看下它的文档吧 https://github.com/caolan/async/

@ravenwang 用回调来处理是一种解决方法,不过只是想取得一个简单的返回值就要用回调函数来处理,如果执行文件需要处理多个这种实例,代码就不好处理了

@liangguohuan 没有你所希望的那种简单方法,exec是异步的,只能用某种异步方式来处理,Callback是最简单的,你之所以会提这个问题是因为还没有熟悉Node的异步思想

@liangguohuan @ravenwang 0.12 就会有同步的 shell 方法出来了。不过遥遥无期啊。

@alsotang 是应该搞些同步的处理方法出来,一些处理才会比较方便,fs.readFileSync,fs.existsSync 都有了。

回到顶部