执行文件: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
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 都有了。