如何在异步函数中停止由回调引起的无限循环

时间:2016-09-01 21:56:51

标签: javascript node.js asynchronous

我的程序中定义了两个异步函数;其中一个ping一个给定的IP地址(使用net-ping模块)并且'返回' (通过回调)ping是否成功,另一个创建到给定IP地址的SSH连接(使用ssh2模块)并且还返回'连接是否成功。

当我尝试使用data.txt功能从readline文件读取IP数据时出现问题。我使用readline模块从文件读取每一行,使用回调以阻塞方式调用ping和ssh,然后将这些返回值放入一个数组中以便稍后使用。我已经能够验证函数是按照我期望的顺序执行的,并且返回值是真正返回的。但是,当程序到达文件的末尾 - 而不是终止时,它只是读取再次提交文件,再次提交。

SSH功能定义为:

function SSH(ipAdress, callback) {

  connection.on('ready', function(err) {

    if(err) {
      throw err;
      returnValue = "ErrorWithReadyConnection";
      callback(null, returnValue);
    }

    //runs the uptime command once we have SSH'd into the machine
    connection.exec('uptime', function(err, stream) { 

      if(err) {
        throw err;
        returnValue = "ErrorRunningCommandFromSSH";
        callback(null, returnValue);

      }
      else {

        stream.on('close', function(code, signal) {

          //code holds the response from running 'uptime'
          console.log("Stream on close. Code : " + code +
                      ". Signal: " + signal);

          connection.end();
          returnValue = "success";
          callback(null, returnValue);

      }).on('data', function(data) {

       console.log("STDOUT: " + data);
      }).stderr.on('data', function(data) {

          console.log("STDERR: " + data);
        });
      }
    }); 

  //Parameters for the SSH connection
  }).connect({
    host: ip,
    port: 22,
    username: userName,
    privateKey: privateKey,
    passphrase: passPhrase
  }); //connect


  //handle any connection errors done whilst creating a connection
  connection.on('error', function(err) {

    if(err) {
      returnString = "ErrorWaitingForHandshake";
      callback(null, returnString);
    }
  }); //end connect
}

ping函数定义为:

function pingFunc(ip, callback) {

  var returnString;

  //Create a ping session, passing the IP of the machine to ping
  sessions.pingHost(ip, function(error, target) {

    //if error, then examine what type of error has occured
    if(error) {

      if(error instanceof ping.RequestTimedOutError) {
         returnString = "RequestTimedOut";
      }


      //else, different error - output the error string.
      else {
        returnString = "Error";
      }

    } //End error handling

    //else, ping was successful
    else {
      returnString = "Alive";
    }

    callback(null, returnString);
  });

  //return returnString;
}

我调用函数的代码是:

var allMachines = new Array();

var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream('data.txt');
});

lineReader.on('line', function(line) {

  pingFunc(line, function(err, pingResult) {
    SSH(line, function(err, sshResult) {

       var machineTemp = [{'ping': pingResult, 'ssh': sshResult }];
       allMachines = allMachines.concat(machineTemp);
    })
  })
}

我计划稍后使用allMachines数组创建一个JSON文件,但是这个无限循环正在停止所有可能的进展。我试图在SSH函数中移动connection.on('error', ...),我认为这会导致无限循环,但事实证明这是徒劳的。

非常感谢任何帮助 - 谢谢!

P.S如果有人知道在readlines完成后我将如何注册,并且allMachines数组已经填充了必要的数据,我也将非常感激!我尝试使用readline.on('close', ...),但是在SSH和ping完成执行之前调用它,所以对我没用!再次感谢

0 个答案:

没有答案