javascript - 如何递归运行 net.Sockets.connect(port, host)?
问题描述
我正在尝试递归运行net.connect(port, host)以便在连接失败时重试一定次数(net.Socket.connect 返回 false),所需的输出是表示连接是否最终的布尔值成功或失败。从逻辑上讲,我可以根据提供的retries值使用 for 循环,但我试图避免 eslint Disallow Functions in Loops (no-loop-func)错误。这是我的 net.connect(port, host) 基本(无重试)实现的代码。我将如何递归地实现这个?
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?
解决方案
推荐阅读
- python - 在python中按字符串中的数值对字符串进行排序
- django - 运行良好一年的 gke pod 上的服务突然开始失败,并出现 db 连接错误
- c# - 模糊图像monogame像素着色器的部分
- kotlin - 在android studio中添加可以更新到mapbox地图的数据
- tensorflow - Tensorflow Probability 中每个实验的具有不同数量可能结果的分类分布
- gnupg - 如何更改 gpg-agent 目录
- javascript - 使链表实例可通过索引和可迭代访问
- vb.net - 整个滚动组合框列表 VB.NET
- python - 我正在使用 python 创建一个 check_html 函数以使用堆栈进行验证
- python - 正则表达式:返回包含年份范围的最大字符串数