CNode

关于 child_process 执行shell命令后返回值问题

Lliangguohuan发布于12 年前最后回复12 年前8 回复11306 浏览0 收藏

执行文件: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)

A
amoa400#1·12 年前

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

L
liangguohuan#2·12 年前
引用 amoa400last.stdout.on是异步返回的,所以你用同步的方法return一个值是拿不到东西的,你也改成异步返回就行了

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

R
ravenwang#3·12 年前

getData 加一个回调函数来处理

L
liangguohuan#5·12 年前
引用 ravenwang给getData 加一个回调函数来处理

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

R
ravenwang#6·12 年前
引用 ravenwang给getData 加一个回调函数来处理

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

A
alsotang#7·12 年前
引用 ravenwang给getData 加一个回调函数来处理

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

L
liangguohuan#8·12 年前
引用 ravenwang给getData 加一个回调函数来处理

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

参与回复
登录后即可参与回复。登录