Сборщик сообщений во время цикла - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь создать диссон-бота с функцией «игра в угадывание чисел».
Когда я запускаю бота, он выдает мне эту ошибку:

FATAL ERROR: Неэффективная оценка-компакты около предела кучи Выделение не удалось - кучи 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');
      }
    }
  });
}

1 Ответ

0 голосов
/ 04 марта 2019

причина в том, что цикл 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...