Discord.js等待网络套接字连接

时间:2020-07-31 11:09:27

标签: javascript sockets async-await discord discord.js

我正在创建一个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放在此处,则文本等于“”。我如何等待他之前完成连接?

1 个答案:

答案 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);
})();