前提:我远不是一个编码大师,虽然不是一个完全的新手,但对JavaScript和不和谐是陌生的。我已经环顾四周,向某人询问了这个问题,但无济于事,所以任何帮助都将不胜感激。(这是使用Node.js,Discord.js)
我开始制作一个简单的机器人来回应你的信息,我成功地做到了。然后,我继续尝试给它一个开关
语句,允许它根据所说的内容做不同的事情。因为我不知道JavaScript,所以我想从简单开始,随着我对它的熟悉,我会一路向上。然而,这并没有那么奏效。
问题:在设置了一个Switch
语句后,我发现它只会使用第一次初始化的Switch
语句的第一个实例。它永远不会交换到下一个。如果开关
语句与我之前看到的不太一样,我将其更改为一个if/elle
语句。奇怪的是,同样的结果也发生了。我把它简化为基本逻辑,但没有用。
// 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
尝试:认为问题可能与无限循环场景有关,我将整个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,并通过更改逻辑以查找未定义的值来在Case 0中初始化它。结果保持不变。
尝试过:接下来我考虑到它可能不像主循环通常那样循环,所以它只运行第一个条件,然后程序基本上结束了。不过,这似乎不太可能,因为当使用诸如以下内容时,它能够监听用户的输入,似乎是无限的:
client.on('message', msg => {
if (msg.content === 'ping') {
msg.reply('pong');
}
});
尝试:出于我自己的好奇心,我尝试用客户端封装整个块。在('message'…
安装程序中,将登录名添加为bot代码以使用它。这种方法虽然有效,但每个用户输入只会上升一步,但在任何程序中,必须输入文本才能上升一步或注册更改都是不理想的。
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*
});
尝试:之后我尝试移动控制台。日志(“初始值:“testNumb”)
和
控制台。日志(“最终值:”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
等等
想法:考虑到所有这些,显然有一个循环在检查内容,但由于某种原因,它在第一次运行循环之后实际上没有对内容做任何事情。我可能遗漏了一些简单的东西,除了
和
for
循环之外,我找不到任何关于循环的信息,因此我只能假设主循环是默认内置的,因为它确实具有侦听和重复的能力,但如果是这样,为什么这个简单的序列不起作用?我知道这不是做事情的最奇特的方式,而且可能有更好的方式来实际制作一个完整的程序/机器人,但是理解为什么这不起作用以及如何修复它是非常关键的。提前感谢您的时间和帮助!
经过反复试验,我找到了这个问题的解决办法。
在Javascript和节点中。js/Discord。js everything被编译并运行一次,只有在调用另一个操作(如消息)时才会被引用。如果被设置为再次运行代码的计时器之类的东西调用,代码最终确实会正常工作。它确实存储了该值,但不会再次接触它,除非eventlistener调用它再次工作。据我所知,循环不会工作,并且会停止,因为它永远不会完成编译。没有办法使用“主循环”设置。因此,唯一的方法是创建一个psudo循环,其中包含重复出现的eventlistener(如超时)。
我不确定这个解释是最好的,还是我遗漏了什么,但是如果有更好的解释,我非常乐意再看一遍,直到那时我会把这个问题标记为已回答。谢谢大家的投入
哦,我知道你做了什么...看:
console.log("Initial value" + testNumb);
if(testNumb == 0){
console.log("Case 0: Entry value: " + testNumb);
testNumb = 1;
console.log("Case 0: Exit value: " + testNumb);
}
有两个问题。第一个是testNumb=1;不能更改if语句范围之外的值。发生的情况是testNumb将被重新定义为1,直到您使用}关闭主体
第二个问题是,如果某项计算结果为true,if-else语句将停止读取代码的其余部分。
现在,如何在您的案例中增加testNumb?使用for循环。它看起来像这样:
// in this example I use "i" instead of "testNumb"
for (let i = 0; i < 5; i++) {
console.log("Case " + i + ": Entry value: " + i);
console.log("Case " + i + ": Exit value: " + i++);
};
console.log("We made it!");
看起来if/else语句正在按预期运行。
我的意思是,你将一个变量testNumb
初始化为0,然后测试它,它在第一种情况下结束,这很正常,因为第一种情况将变量与0进行比较。这有什么不同?
我打赌如果您将testNumb
变量初始化为1,它将在第二种情况下结束。
问题内容: 我是一个新手,Python和目前正在学习像控制流的命令,等 该语句工作正常,但是当我编写或命令时,解释器给我一个语法错误。我使用的是Python 3.2.1,问题出在其本机解释器和IDLE中。 我遵循的是 《 Python的字节》一 书中给出的内容。如您所见,并且给出了 Invalid Syntax 。 为什么会这样呢?我在IDLE和交互式python中都遇到了问题。我希望语法正确。
switch 语句评估一个表达式,将表达式的值与case子句匹配,并执行与该情况相关联的语句。—— MDN switch 是另一种控制流程的方式,根据条件执行不同的代码块。 能用 switch 实现的都可以用 if 实现。 1. 基本语法 switch (表达式) { case 表达式结果为值1的时候: 做的事情; break; case 表达式结果为值
我是Javascript的新手,正在尝试通过制作一个小程序来学习,在这个程序中输入占星星座、行星和房屋来制作一个madlibs类型的小故事。为此,我在一个函数中放入了三个switch语句。 不确定这是不是太多的switch语句,但是,当我在Chrome上加载它时,有时我只得到text,有时我得到text和text2,有时我只得到text3。 有人知道为什么会这样吗?我只是在一个函数中有太多swit
我想用Javascript、DOM、HTML和CSS构建一个游戏。我的逻辑是这样的: Step4:如果值彼此不相等,程序会要求刷新浏览器。 但问题是,当我在浏览器中运行这段代码时,只有else语句起作用,if/else-if不起作用。另一个问题是:单击“Button number Three”时,else语句在<标记中显示随机数之前起作用。
问题内容: 我是Java的新手,正在尝试学习速记语句的概念。 我想出了下面的代码。但是,该代码将无法编译,并在(即?:)语句旁边显示错误。 有人可以告诉我为什么它不起作用吗? 对不起,如果我的问题对某些人听起来很愚蠢。我是Java新手。 在此先感谢您的帮助! 问题答案: 三元表达 是一个 表达式 ,而不是一个语句,因此不能在需要语句的地方使用。 您可以这样写: 因为这是一个声明。
我刚开始学C++,我试着做一个骰子游戏,用户输入一个1到6之间的数字,然后代码打印一个在这个范围内的随机数,如果y和z相同,你就赢了。 这是我的代码,但当我输入一个数组中没有的数字时,它的工作方式就好像它在数组中一样。 (输入是y)(数组是x)(你需要赢的数字是z) 此外,我可能会更改它,使它只读取数组,这样用户甚至可以放入骰子的边数,如果这样做顺利的话。