首页 > 解决方案 > 尝试为迭代添加延迟

问题描述

所以我有这个命令,除了具有特定角色的人之外,它基本上会将语音频道中的每个人都静音,而且效果很好!

但是我也希望它在静音之间需要一两秒钟,所以我不是 API 垃圾邮件,并且被禁止使用 discord.js,那么我该怎么做呢?

代码:

message.delete({ timeout: 150 });
const vc = message.member.voice.channel;
if (!vc) return message.reply("You must be in a voice channel to run this!").then(msg => {
    msg.delete({ timeout: 5000 })
})
    let users = vc.members.filter(member => !member.roles.cache.has("753465550604075039")).map(fn => `<@${fn.id}> | ID: ${fn.id}`)
    let mutinguser = vc.members.filter(member => !member.roles.cache.has("753465550604075039"))
    if (mutinguser.size === 0) return message.channel.send("There's no one to mute!")
    if (mutinguser.size > 10) return message.channel.send(`I can only mute 10 people at a time! There's ${mutinguser.size} users in this voice channel!`)
    mutinguser.array().forEach(m => m.voice.setMute(true))
    let muting = new Discord.MessageEmbed()
        .setColor("GREEN")
        .setTitle(`Muting Users in [${vc.name}]`)
        .setDescription(users)
        .setFooter(` Users Muting: ${users.length} \n Total Users: ${vc.members.size}`)
    message.channel.send(muting)

标签: javascriptdiscorddiscord.js

解决方案


你不能完全在 JS 中添加延迟,因为代码在浏览器的 UI 线程的上下文中运行,延迟会导致 UI 冻结。

您可以做的是安排一个函数在未来运行几毫秒。

例如:

let arr = [ "item 1", "item 2", "item 3" ];

function handleNext(idx) {
    if (idx == arr.length) {
        return;
    }

    console.log(arr[idx]);

    setTimeout(() => {
        // call handleNext() again for the next element
        handleNext(idx + 1);
    }, 500);
}

// kick it off
handleNext(0);

上面的代码应该立即将“item 1”打印到控制台,然后在 500ms 后打印“item 2”,再过 500ms - 打印“item 3”。

请注意,代码不会在调用handleNext(0);时“卡住”。它会调用它,然后继续过去。这意味着 UI 将保持响应。这也意味着其他代码可以在 500 毫秒延迟期间运行,因此您需要确保它不会handleNext()以危险的方式干扰变量访问。


推荐阅读