【问题标题】:Message collector in while loopwhile循环中的消息收集器
【发布时间】:2019-03-04 06:26:34
【问题描述】:

我正在尝试制作一个具有“猜数字游戏”功能的不和谐机器人。
当我运行机器人时,它给了我这个错误:

致命错误:接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足

似乎 while 循环变成了无限循环。这是我的代码(声明了所有函数和变量)

while (numberOfGuesses < 5) {
  const collector = new Discord.MessageCollector(message.channel, m => m.author.id === message.author.id, {
    time: 10000,
    max: 1
  });
  collector.on('collect', message => {
    if (guess.length == 0 || !guessInRange(guess)) {
      message.channel.send('please say 1~100');
    } else {
      if (parseInt(guess) == secretNumber) {
        message.channel.send('Boom! Correct!');
        return collector.stop();
      } else if (parseInt(guess) < secretNumber) {
        numberOfGuesses++;
        message.channel.send('Too small');
        collector.stop();
      } else {
        numberOfGuesses++;
        message.channel.send('Too big');
        collector.stop();

      }
      if (numberOfGuesses == 5) {
        collector.stop();
        return message.channel.send('Game over');
      }
    }
  });
}

【问题讨论】:

  • 没有什么会阻塞执行,所以每次迭代都会将一个新的收集器添加到堆栈中。然后,您的内存不足。在循环之外声明收集器将很快解决您的问题,但您可能希望使用不同的方法。如果其他人没有帮助,我会在第二个详细说明。

标签: javascript while-loop discord.js


【解决方案1】:

原因是 while 循环运行非常快。虽然消息来得很慢。 因此,当 5 个“猜测”出现时,循环可能已经运行了一百万次。也因此获得了一百万收藏家。

试试这个:

function getGuesses(numberOfGuesses,maxGuesses){
const collector = new Discord.MessageCollector(message.channel, m => m.author.id === message.author.id, { time: 10000, max: 1 });
    collector.on('collect', message => {
        if (guess.length == 0 || ! guessInRange(guess)) {
            message.channel.send('please say 1~100');                
        } else {
            if (parseInt(guess) == secretNumber) {
                message.channel.send('Boom! Correct!');
                return collector.stop();
            } else if (parseInt(guess) < secretNumber) {
                numberOfGuesses++;
                message.channel.send('Too small');
                collector.stop();
            } else {
                numberOfGuesses++;
                message.channel.send('Too big');
                collector.stop();

            }
            if (numberOfGuesses == maxGuesses) {
                collector.stop();
                return message.channel.send('Game over');
            }
        }   
    });

    //Repeat if guesses still exist
    collector.on('end', collected => {
        if(numberOfGuessed < maxGuesses) getGuesses(numberOfGuesses,maxGuesses)
    });
};

getGuesses(0,5);

【讨论】:

  • 在等待 5 次猜测时,您可能仍需要阻止执行。任何等待 numberOfGuesses 等于 maxGuesses 或在此函数底部关闭收集器的空 while 循环都可以执行
  • 真的。但这不是他要求的问题……也不能解决他的错误。我提供的解决方案只是解决了他的问题。
猜你喜欢
  • 2020-11-02
  • 1970-01-01
  • 2021-04-20
  • 2021-03-31
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
相关资源
最近更新 更多