我正在创建一个Discord机器人来检查服务器的状态。 我对此代码部分有一些疑问:
var text = "";
var hosts = client.getHosts.all(channel.guild.id);
hosts.forEach(function(item) {
var sock = new net.Socket();
sock.setTimeout(2500);
sock.on('connect', function() {
text += item.name + ": ONLINE ✅";
sock.destroy();
}).on('error', function(e) {
text += item.name + ": OFFLINE ⛔";
}).on('timeout', function(e) {
text += item.name + ": OFFLINE ⛔";
}).connect(item.port, item.ip);
});
console.log(text);
如果我将console.log放在此处,则文本等于“”。我如何等待他之前完成连接?
答案 0 :(得分:1)
您可以使用for
循环:
const getStatusOfSocket = (item) => {
return new Promise((resolve) => {
var sock = new net.Socket();
sock.setTimeout(2500);
sock.on('connect', function() {
sock.destroy();
resolve(true);
}).on('error', function(e) {
resolve(false);
}).on('timeout', function(e) {
resolve(false);
}).connect(item.port, item.ip);
});
};
var text = "";
var hosts = client.getHosts.all(channel.guild.id);
for(let item of hosts){
const isOnline = await getStatusOfSocket(item);
if(isOnline) text += item.name + ": ONLINE ✅";
else text += item.name + ": OFFLINE ⛔";
}
console.log(text);
请注意,当我使用await
时,您的代码应该在异步函数中。可以通过以下操作轻松完成此操作:
(async () => {
const getStatusOfSocket = (item) => {
return new Promise((resolve) => {
var sock = new net.Socket();
sock.setTimeout(2500);
sock.on('connect', function() {
sock.destroy();
resolve(true);
}).on('error', function(e) {
resolve(false);
}).on('timeout', function(e) {
resolve(false);
}).connect(item.port, item.ip);
});
};
var text = "";
var hosts = client.getHosts.all(channel.guild.id);
for(let item of hosts){
const isOnline = await getStatusOfSocket(item);
if(isOnline) text += item.name + ": ONLINE ✅";
else text += item.name + ": OFFLINE ⛔";
}
console.log(text);
})();