【问题标题】:Nodejs Promises unusual behaviour with execNodejs 承诺 exec 的异常行为
【发布时间】:2015-10-19 16:29:29
【问题描述】:

我正在 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);
  }
}());

【问题讨论】:

  • 等等,预期输出和实际输出之间到底有什么区别?

标签: node.js


【解决方案1】:

在调用execute 之前,您不是在等待compile 解析,而是使用execute 的返回值作为then 的参数,这恰好是解析的Promise

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

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

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

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

或者,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2018-07-24
    • 2018-11-03
    • 2019-06-21
    • 2018-06-09
    • 2014-01-04
    • 2020-07-01
    相关资源
    最近更新 更多