在javascript node.js上依次运行两个函数

我试图在javascript node.js上一个接一个地运行这两个函数

这个函数运行一个bat文件

function loadTime() { var exec = require('child_process').exec; exec('C:\\Temp\\tasks\\acis\\runme.bat', function(error, stdout, stderr) { console.log('stdout: ' + stdout); if (error !== null) { console.log('exec error: ' + error); } }); } 

我必须等待这个bat文件的结果才能运行下一个函数

 function parseTime() { var parser = new xml2js.Parser(); fs.readFile('C:\\Temp\\tasks\\acis\\2.sat\\2.sat.response.xml', function(err, data) { parser.parseString(data, function(err, result) { var timeString = result.Message.Response[0].Events[0].MessageReportEvent[8].$.Message; var fileTime = timeString.substr(13, 20); console.log(fileTime); }); }); } 

但在JavaScript中,当我运行这个

 loadTime(); parseTime(); 

看来parseTime()函数在loadTime()完成运行之前开始运行。 如何在loadTime()完成后运行parseTime()

您可以简单地给loadTime()一个callback函数,它在完成加载后执行,并且将此callback函数作为您的parseTime()

像这样的东西可能会工作(我还没有testing过)

 function loadTime(callback){ var exec = require('child_process').exec; exec('C:\\Temp\\tasks\\acis\\runme.bat', function(error, stdout, stderr) { console.log('stdout: ' + stdout); if (error !== null) { console.log('exec error: ' + error); }else{ // Assuming you want parseTime() to fire if there were no errors in loadTime() // When we reach this point, we want to fire our callback function callback(); } } ); function parseTime(){ var parser = new xml2js.Parser(); fs.readFile('C:\\Temp\\tasks\\acis\\2.sat\\2.sat.response.xml', function(err, data) { parser.parseString(data, function (err, result) { var timeString = result.Message.Response[0].Events[0].MessageReportEvent[8].$.Message; var fileTime = timeString.substr(13,20); console.log(fileTime); }); }); }; // We call loadTime() with parseTime() as its callback loadTime(function(){ parseTime(); }); 

你也可以在loadTime()中调用parseTime()方法,这样一旦loadTime()完成,那么只调用parseTime()。 否则,您可以使用nodejs的asynchronous模块来完成此操作。

函数loadTime(完成){

 var exec = require('child_process').exec; exec('C:\\Temp\\tasks\\acis\\runme.bat', function(error, stdout, stderr) { console.log('stdout: ' + stdout); if (error !== null) { console.log('exec error: ' + error); } done(); }); function parseTime() { var parser = new xml2js.Parser(); fs.readFile('C:\\Temp\\tasks\\acis\\2.sat\\2.sat.response.xml', function(err, data) { parser.parseString(data, function(err, result) { var timeString = result.Message.Response[0].Events[0].MessageReportEvent[8].$.Message; var fileTime = timeString.substr(13, 20); console.log(fileTime); }); }); }; loadTime( function() { parseTime(); } ); 

你可以设置你的函数来接受像这样的callback:

 function first(callback) { console.log("First!"); callback(); } function second() { console.log("Second!"); } first(second); 

应该输出到控制台:首先! 第二!

你很可能希望能够使callback可选,所以它不会错误,如果它没有通过:

if ( callback ) callback();