更改函数执行顺序会使应用程序不同步 - node.js



我有这段代码:

function asyncFunction (version, xmlConfig, resolve) {
  var xmlFileName = "/path/to/file/file.xml";
  fileService.generateXmlToFile(xmlFileName, xmlConfig, function(){
    runningService.startApp(appDir, version, function(exitCode){
      if (exitCode == 0) {
        console.log("App " + version + " started");
        multiJobService.runMultipleJobTypes(id, version, allJobsConfig, appDir, function(){
          runningService.stopApp(appDir, version, function(exitCode){
            if (exitCode == 0) {
              console.log("App " + version + " stopped");
              resolve();
            } else {
              console.log("App " + version + " failed to stop. Exit code " + exitCode);
            }
          });
        });
      } else {
        console.log("App " + version + " failed to start. Exit code " + exitCode);
      }
    });
   });
}
它启动我的应用程序的一个版本,运行各种测试,停止应用程序,

启动应用程序的下一个版本,再次运行测试,最后停止应用程序。 目前,这按预期工作。

以下是 startApp 和 stopApp 函数:

startApp: function(appDir, version, callback) {
    console.log("App " + version + " starting...");
    var child = exec(
              config.env().path.scripts + "/appstart.sh " +
              appDir + " " + 
              version + " " + 
              "127.0.0.1" 
            );
    child.stdout.on('data', function(data) {
      console.log(data);
    });
    child.stderr.on('data', function(data) {
      console.log(data);
    });
    child.on('close', function(code) {
      callback(code);
    });
  },
  stopApp: function(appDir, version, callback) {
    console.log("App " + version + " stopping...")
    var child = exec(
              config.env().path.scripts + "/appstop.sh " +
              appDir + " " + 
              version + " " 
            );
    child.stdout.on('data', function(data) {
      console.log(data);
    });
    child.stderr.on('data', function(data) {
      console.log(data);
    });
    child.on('close', function(code) {
      callback(code);
    });
  }

我想为此添加一些功能。这项工作的第一部分是确保应用程序已停止。为此,我希望只是交换调用startApp和stopApp函数的顺序。这是我的新代码:

function asyncFunction (version, xmlConfig, resolve) {
  runningService.stopApp(appDir, version, function(exitCode){
    if (exitCode == 0) {
      console.log("App " + version + " stopped");
      resolve();
    } else {
      console.log("App " + version + " failed to stop. Exit code " + exitCode);
    }
  });
  var xmlFileName = "/path/to/file/file.xml";
  fileService.generateXmlToFile(xmlFileName, xmlConfig, function(){
    runningService.startApp(appDir, version, function(exitCode){
      if (exitCode == 0) {
        console.log("App " + version + " started");
        multiJobService.runMultipleJobTypes(id, version, allJobsConfig, appDir, function(){
        });
      } else {
        console.log("App " + version + " failed to start. Exit code " + exitCode);
      }
    });
  });
}

当我运行它时,启动应用程序在停止应用程序完成之前开始。这会导致错误,其中 startApp 失败,因为检测到正在运行的应用进程。我该如何解决这个问题?

我在错误的位置关闭了停止应用程序。 当我将停止应用程序的});移动到启动应用程序之后时,我的应用程序按预期工作。这是我更新的代码:

function asyncFunction (version, xmlConfig, resolve) {
  runningService.stopApp(appDir, version, function(exitCode){
    if (exitCode == 0) {
      console.log("App " + version + " stopped");
      resolve();
    } else {
      console.log("App " + version + " failed to stop. Exit code " + exitCode);
    }
  var xmlFileName = "/path/to/file/file.xml";
  fileService.generateXmlToFile(xmlFileName, xmlConfig, function(){
    runningService.startApp(appDir, version, function(exitCode){
      if (exitCode == 0) {
        console.log("App " + version + " started");
        multiJobService.runMultipleJobTypes(id, version, allJobsConfig, appDir, function(){
        });
      } else {
        console.log("App " + version + " failed to start. Exit code " + exitCode);
      }
    });
  });
});
}

最新更新