2015-10-19 19 views
0

我正在执行中的NodeJS下面的代码不寻常的行为,并希望像这样的输出: 和希望输出这样的NodeJS公司承诺以exec

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

等待,究竟什么是预期和实际产出之间的差异? – Bergi

回答

0

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

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

当函数run_code体进行评价时,不compile消除了在给then的参数进行评价。等待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); });