它发送的成员数量是其数量的4倍

时间:2019-12-18 17:27:01

标签: node.js discord discord.js

所以我希望我的机器人在某个服务器上每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!

2 个答案:

答案 0 :(得分:1)

这部分代码:

for (i = 0; i < list.length; i++) {
  console.log(list.length);
}

告诉Javascript运行该语句:

  console.log(list.length);

list.length次。如果list.length4,它似乎在这里,那么您将在控制台中看到

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)