javascript - 尝试为迭代添加延迟
问题描述
所以我有这个命令,除了具有特定角色的人之外,它基本上会将语音频道中的每个人都静音,而且效果很好!
但是我也希望它在静音之间需要一两秒钟,所以我不是 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)
解决方案
你不能完全在 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()
以危险的方式干扰变量访问。
推荐阅读
- ksqldb - 如何实现 KSQLDB 初始化脚本?
- sqlite - SQLite - FOREIGN KEY 不起作用(是的,它已启用)
- javascript - 如何使用 fs.readFileSync 获得德语变音符号?
- php - 如何查找多个 ID
- javascript - dc.js v4.1.0 和 d3 v6.1.1:未捕获的类型错误:无法读取未定义的属性“2”;d 是鼠标事件
- python - 清理亚马逊链接的正则表达式
- c# - 我如何发送消息选项卡和向上箭头发送到 winform?C#
- sql - SQL - 一行中有多个记录
- python - 通过 PRESTO 连接器选择随机数据样本
- python - urllib.error.URLError:
代码:
import os import tarfile from urllib.request import urlretrieve