Nodejs使用exec承诺异常行为

时间:2015-10-19 16:29:29

标签: node.js

我正在nodejs中执行以下代码,并希望输出如下: 并希望得到像这样的输出

Running Code
Compiling Code
Executing Code
Done Execution
Done Compiling
Done everything

但输出是这样的:

Running Code
Compiling Code
Executing Code
Done Execution
Done Compiling
Done everything

这是一种奇怪的行为:/

var sys = require('sys');
var exec = require('child_process').exec;
var Q = require('q');

var script_sh = 'bash -c' + ' "echo "hegr" ;"';

function compile(req, res) {

  var deferred = Q.defer();

  console.log('Compiling Code');

  exec(script_sh, function puts(err, stdout, stderr) {
    if (err || stderr) {
      console.log('Error While Compiling');
      console.log(err);
      res.send(stderr || err );
      return deferred.reject(err);

    }
    console.log('Done Compiling');
    return deferred.resolve();
  });
  return  deferred.promise;
}

function execute(req, res) {
  console.log('Executing Code');

  var deferred = Q.defer();

  exec(script_sh, function puts(err, stdout, stderr) {
    if (err || stderr) {
      console.log('Error While Execution');
      console.log(err || stderr);
      res.send(err);
      return deferred.reject(err || stderr);
    }
    console.log('Done Execution');
    return deferred.resolve();
  });
  return  deferred.promise;
}

function run_code(req,res) {

  console.log('Running Code');

  compile(req,res)
    .then(execute(req,res))
    .then(function() {
      console.log('Done everything');
    }).fail(function (error) {
      error.status = 412;
      return ;
    });
};

module.exports = run_code;
(function() {
  if (require.main == module) {
    var req = console.log;
    var res = console.log;
    res.send = console.log;
    run_code(req,res);
  }
}());

1 个答案:

答案 0 :(得分:0)

您在调用compile之前不等待execute解析,而是使用execute的返回值作为then的参数,成为已解决的Promise;

 compile(req,res)
    .then(execute(req,res))

then的参数在评估函数run_code的主体时评估,而不是在compile结算时评估。要在执行compile之前等待execute解决,请使用:

compile(req, res) .then(execute.bind(null, req, res));

execute.bind(null, req, res)将返回一个预绑定函数,该函数将在compile结算后执行。

可替换地,

compile(req, res) .then(function () { return execute(req, res); });