Я пытаюсь рекурсивно запустить 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, прежде чем я смогу повторить попытку подключения?