Новое в Javascript (Discord bot), операторы If-Else / Switch не работают - PullRequest
2 голосов
/ 27 апреля 2020

Предпосылка: я далек от мастера кодирования, хотя и не начинающий, но я новичок в JavaScript и Discord. Я посмотрел вокруг и спросил кого-то об этой проблеме, но безрезультатно, поэтому любая помощь будет высоко ценится. (Используется Node.js, Discord. js)

Я начал создавать простого бота, который отвечал бы на ваше сообщение, и я успешно это сделал. Затем я перешел, чтобы попытаться дать ему switch утверждение, позволяющее ему делать разные вещи в зависимости от того, что было сказано. Так как я не знал JavaScript, я думал, что начну с простого и продолжу свой путь, как только познакомлюсь с этим. Однако это не сработало так хорошо.

Проблема: После настройки оператора switch я обнаружил, что он будет использовать только первый экземпляр оператора switch, который был первым инициализируется. Это никогда не поменяется на следующее. В случае, если операторы switch не работают так же, как я видел прежде, я изменил их на оператор if/else. Как ни странно, такие же результаты произошли. Я упростила его до базового c logi c безрезультатно.

// Run dotenv
require('dotenv').config();

const fs = require('fs');
const Discord = require('discord.js');
const client = new Discord.Client();

//Set Var
var testNumb = 0;


// Code Start
  console.log("Initial value" + testNumb);
  if(testNumb == 0){
    console.log("Case 0: Entry value: " + testNumb);
    testNumb = 1;
    console.log("Case 0: Exit value: " + testNumb);
  }else if(testNumb == 1){
    console.log("Case 1: Entry value: " + testNumb);
    testNumb = 2;
    console.log("Case 1: Exit value: " + testNumb);
  }else if(testNumb == 2){
    console.log("Case 2: Entry value: " + testNumb);
    testNumb = 3;
    console.log("Case 2: Exit value: " + testNumb);
  }else if(testNumb == 3){
    console.log("Case 3: Entry value: " + testNumb);
    testNumb = 4;
    console.log("Case 3: Exit value: " + testNumb);
  }else{
    console.log("We made it!");
    console.log("Current Value: " + testNumb);
  };
console.log("Final value: " + testNumb);

Результаты в консоли:

Initial value: 0
Case 0: Entry value: 0
Case 0: Exit value: 1
Final value: 1

Попытка: Думать, что проблема может быть связана с сценарий бесконечного l oop Я инкапсулировал весь if/else в

var testLoopGuard = 0;
if(testLoopGuard == 0){
  if(testNumb == 4){ testLoopGuard = 1; };
  console.log(testLoopGuard);
};

, что не имеет значения, но testLoopGuard остается на 0. Результаты в консоли:

Initial value: 0
Case 0: Entry value: 0
Case 0: Exit value: 1
0
Final value: 1

Попробовал: Моей следующей мыслью было, что, возможно, первоначальный набор var testNumb = 0 был зациклен, а не только инициализирован. Поэтому я изменил его на var testNumb;, чтобы вызвать инициализацию, которая устанавливает его в null, и инициализировал его в случае 0, изменив logi c для поиска неопределенного значения. Результаты остались прежними.

Пробовал: Затем я подумал, что, возможно, он не зацикливался, как обычно делал бы основной L oop, поэтому он выполнял только первое условие, а затем программа по существу заканчивалась. Хотя это не казалось вероятным случаем, поскольку он мог прослушивать ввод пользователя, кажущийся бесконечным, когда использовал что-то вроде:

client.on('message', msg => {
  if (msg.content === 'ping') {
    msg.reply('pong');
  }
});

Попытка: из собственного любопытства я попытался инкапсулировать весь блок с помощью client.on('message'... установка, добавление логина в качестве кода бота, чтобы использовать его. Это полуработал, но только на go вверх на один шаг для каждой пользовательской записи, но необходимость ввести текст, чтобы позволить ему go на шаг или зарегистрировать изменение, далеко от идеала в любой программе.

client.on('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
});

client.login(process.env.DISCORD_TOKEN);

client.once('ready', () => {
    console.log('Ready!');
});


client.on('message', message => {
*original code*
});

Попытка: После этого я попытался переместить console.log("Initial value: " + testNumb); и console.log("Final value: " + testNumb); за пределы инкапсуляции, но они работали только один раз при первом запуске и никогда больше. Результаты в консоли:

Initial value: 0
Final value: 0
Case 0: Entry Value: 0
Case 0: Exit Value: 1
*user entry*
Case 1: Entry Value: 1
Case 1: Exit Value 2
*user entry*
Case 2: Entry Value: 2
Case 2: Exit Value 3

и т. Д.

Мысли: Имея это в виду, очевидно, что oop продолжает проверять содержимое, но по какой-то причине это не так. на самом деле ничего не делал с содержимым после первого запуска l oop. Я, скорее всего, упускаю что-то простое и не могу найти никакой информации о циклах, кроме циклов while и for, поэтому я могу только предположить, что основной l oop встроен по умолчанию, поскольку он действительно способен слушайте и повторяйте, но если так, то почему эта простая последовательность не работает? Я знаю, что это не самый модный способ сделать что-то, и, вероятно, есть гораздо лучшие способы сделать полноценную программу / бот, но понимание того, почему это не работает и как это исправить, является довольно важным. Спасибо за ваше время и помощь заранее!

1 Ответ

0 голосов
/ 27 апреля 2020

Похоже, что оператор if / else выполняется, как и ожидалось.

Я имею в виду, вы инициализируете переменную testNumb в 0 и тестируете ее, в конечном итоге она заканчивается в первом случае, это вполне нормально, потому что здесь В первом случае сравните переменную с 0. Как это может отличаться?

Бьюсь об заклад, если вы введете переменную testNumb в 1, она закончится во втором случае.

...