簡體   English   中英

它的發送數量是會員數量的 4 倍

[英]It's sends 4 times the amount of members

所以我希望某個服務器中的機器人每 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!

這部分代碼:

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 循環聲明可能會導致一個錯誤(這是一件好事,因為你會立即看到編碼錯誤並修復它)。

這里有一些錯誤。 對於:JavaScript 變量作用域讓你一團糟( 這里有不同的例子

其次: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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM