在javascript node.js上一个接一个地运行两个函数

时间:2015-11-18 06:27:56

标签: 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()完成运行之前开始运行。 parseTime()完成后如何运行loadTime()

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

function loadTime(done){

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

答案 2 :(得分:1)

您可以简单地为loadTime()提供一个在完成加载后执行的回调函数,并将此回调函数设为您的parseTime()

这样的事可能有用(我还没有测试过)

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

答案 3 :(得分:1)

您可以将功能设置为接受如下回调:

$(function () {

    var $list;
    var $newItemForm;
    var $newItemButton;
    var item = '';
    $list = $('ul');
    $newItemForm = $('#newItemForm');
    $newItemButton = $('#newItemButton');

    // ADDING A NEW LIST ITEM
    $newItemForm.on('submit', function (e) {
        e.preventDefault();
        var text = $('input:text').val();
        $list.append('<li>' + text + '</li>');
        $('input:text').val('');
    });

    $list.on('click', 'li', function () {
        var $this = $(this);
        var complete = $this.hasClass('complete');

        if (complete === true) {
            $this.animate({}, 500, 'swing', function () {
                $this.remove();
            });
        } else {
            item = $this.text();
            $this.remove();
        }
    });

});

localStorage.setItem($list);

//add animations when you learn how to...

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

您很可能希望能够选择回拨,以便在未通过时不会出现错误:

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