Как мне рекурсивно запустить net.Sockets.connect (порт, хост)? - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь рекурсивно запустить net.connect (порт, хост) , чтобы он повторял заданное количество раз, пока не удается установить соединение (net.Socket.connect возвращает false), с желаемымoutput - это логическое значение, представляющее, в конечном итоге, соединение было успешным или неудачным. Логически, я мог бы использовать цикл for на основе предоставленного значения retries , но я пытаюсь избежать ошибки eslint Disallow Functions in Loops (no-loop-func) . Вот мой код для базовой (без повторов) реализации net.connect (порт, хост). Как мне реализовать это рекурсивно?

const net = require('net');

checkPort(host, port, callback) {
    try {
      const socket = new net.Socket();
      let status = false;
      socket.connect(port, host, () => {
        status = true;
        socket.setTimeout(1000, () => socket.destroy());
      });
      socket.setTimeout(1000);
      socket.on('timeout', () => {
        socket.destroy();
      });
      socket.on('close', () => callback(status, null));

      return callback(status, null);
    } catch (err) {
      return callback(null, err);
    }
  }

Может показаться, что вызов net.connect рекурсивен, но перед закрытием он выполняется только один раз:

const net = require('net');

const socket = new net.Socket();
const port = 8080;
const host = 'pizza.com';
const retries = 5;
let attempt;
let status = false;

function tryConnect(attempts) {
  socket.connect(port, host);
  socket.setTimeout(100);
  attempt = attempts;
}

// this behave normally
socket.on('connect', () => {
  status = true;
  console.log(status);
  console.log('Connected to', host, 'on', port);
  socket.destroy();
});

// this unexpectedly leads to just one attempt to connect before closing
socket.on('timeout', () => {
  attempt += 1;
  if (attempt <= retries) {
    console.log('Connection failed. Retrying (Attempt ', attempt, 'of', retries, ').');
    tryConnect(attempt);
  } else {
    console.log('Connection to', host, 'on port', port, 'failed.');
    socket.destroy();
  }
});

socket.on('close', () => {
  console.log('Connection closed');
});

socket.on('error', () => {
  console.log(status);
});

tryConnect(0);

Что мне нужно иметьсделано по-другому в структурировании этого? Кроме того, нужно ли уничтожить, завершить или закрыть net.Socket, прежде чем я смогу повторить попытку подключения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...