2015-10-19 91 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); });