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