所以我希望我的机器人在某个服务器上每10分钟向随机成员发送一次dm。当我的机器人从服务器向所有人发送了dm后,它会发送完整的消息。
但是当我启动漫游器时,它会发送4倍的成员数量
if (message.content.startsWith(botconfig.prefix + 'dmall')) {
console.log("demo");
var list = message.guild.members.array();
sendMessage(list);
}
});
function sendMessage(list) {
setTimeout(function () {
for (i = 0; i < list.length; i++) {
console.log(list.length);
}
console.log("I'm done, mate!");
sendMessage(list);
}, 10 * 1000);
}
控制台:
demo
4 (is the amount of the members)
4
4
4
I'm done mate!
答案 0 :(得分:1)
这部分代码:
for (i = 0; i < list.length; i++) {
console.log(list.length);
}
告诉Javascript运行该语句:
console.log(list.length);
list.length
次。如果list.length
是4
,它似乎在这里,那么您将在控制台中看到
4
4
4
4
这就是代码的指示操作。
除非您要分别输出每个数组元素,否则我看不出将其循环放置的任何原因。因此,如果您只想输出一次长度,则替换为:
for (i = 0; i < list.length; i++) {
console.log(list.length);
}
与此:
console.log(list.length);
此外,如果要使用for
循环,则必须声明所有使用的变量。所以,这:
for (i = 0; i < list.length; i++) {
是非常危险的。它依赖于范围更大的i
,它可以很容易地与其他范围更大的i
变量发生冲突并创建难以理解的错误。每个for
循环都应声明自己的循环变量,如下所示:
for (let i = 0; i < list.length; i++) {
如果以严格模式运行代码(应该这样做),则上述for循环声明可能会导致错误(这是一件好事,因为您会立即看到编码错误并进行修复)。
答案 1 :(得分:0)
这里有些错误。 对于:JavaScript变量作用域使您迷惑(Different example here
第二个:setTimeout与setInterval不同。
完全解决您的问题将是:
// Use the discord API
let users = ['justme']
function getUsers() {
// Mutate just to display a new one each time
users = [...users, users.length.toString()];
return users
}
function notifyUsers() {
// Retrieve all users now
const currentUsers = getUsers()
// Send a message to each user
currentUsers.forEach(user => sendMessage(user))
console.log('I have sent everyone a message')
}
function sendMessage(user) {
console.log(`Sending message to ${user}`)
}
// Start the application by looping every <whatever>
setInterval(() => notifyUsers(), 1000)