Javascript 使用setInterval随时间以增量减少变量
所以现在,我是一名编码初学者,我对setInterval命令有很多问题。我想做的是有一个函数,每经过5秒,就把一个变量减少1。然而,尽管我查看了许多不同的线程,并提供了有关setInterval命令的信息,但它们似乎都不符合我的需要(尽管我可能错过了一些东西),而且我无法操纵在其他地方看到的任何东西来执行我的功能Javascript 使用setInterval随时间以增量减少变量,javascript,html,Javascript,Html,所以现在,我是一名编码初学者,我对setInterval命令有很多问题。我想做的是有一个函数,每经过5秒,就把一个变量减少1。然而,尽管我查看了许多不同的线程,并提供了有关setInterval命令的信息,但它们似乎都不符合我的需要(尽管我可能错过了一些东西),而且我无法操纵在其他地方看到的任何东西来执行我的功能 while (fullness <= 10) { setInterval(hungry{ fullness--; }, 1000); } while(fullness您
while (fullness <= 10) {
setInterval(hungry{ fullness--; }, 1000);
}
while(fullness您的代码错误原因:
//There is no need to loop and call setInterval multiple times
//setInterval will fire the callback function every x milliseconds,
//In your example you have it firing every 1 second(1000 milliseconds)
//while (fullness <= 10) {
//setInterval(hungry{ fullness--; }, 1000);
//}
//无需多次循环和调用setInterval
//setInterval将每隔x毫秒启动一次回调函数,
//在您的示例中,它每1秒(1000毫秒)触发一次
//while(fullness您必须首先为setInterval设置一个变量,然后使用clearInterval停止迭代(很重要,否则循环将无限期地迭代)。并检查fullness是否大于0
var fullness = 10;
var timer = setInterval(function(){
if(fullness > 0){
fullness--;
}
else{
clearInterval(timer);
}
}, 5000);
以下是您可能尝试以同步方式而不是异步方式使用setInterval()
的工作原理
调用setInterval(函数,句点)时
它只会启动一个计时器,该计时器每隔时间段
毫秒调用给定的函数。调用setInterval
后,javascript将立即继续执行下一行代码。如果在while循环结束后立即检查满度
值,您可能会注意到它没有改变(然而!)
我建议您编写一个新函数来处理更改fullness
并对更改作出反应:
function updateHunger() {
fullness--;
if (fullness < 10) {
//Do something
}
else {
//You have to call clearInterval() to stop the timer
clearInterval(hungerTimer);
}
}
请记住在一个作用域中声明hungerTimer
变量,该变量可以从updateHunger()
和调用setInterval()的方法访问
您遇到这种情况的原因是JS在一个线程中运行。等待1秒阻止它会使整个浏览器暂停,这就是为什么JS不允许它,而且我们没有sleep()
在JS中,我们有计时器API
但尽管如此,直接编写看起来是同步的循环还是很好的,因为这是我们“正常”的想法。这就是为什么现在如果使用支持异步和生成器的引擎,实际上可以编写类似的内容:
// ES6 features
const sleeper = (x, timeout) =>
new Promise(resolve => setTimeout(resolve, timeout, x));
function* timer(count, timeout) {
for (let i = count; i >= 0; i--) {
yield sleeper(i, timeout);
}
}
async function main() {
for (let i of timer(10, 1000)) {
console.log(await i); // Blocks the main() function but not the JS main thread!
}
}
main();
console.log("The call to main() was non-blocking");
欢迎来到Stack Overflow。让我们看看您是否可以提供更多信息。您打算做什么?What isHunger
?您打算将其作为一个函数调用吗?您是否理解setTimeout和setInterval之间的区别,看看哪一个更合适?现在,我正在尝试一个函数,它可以减少他每隔几秒钟将“fullness”变量改为1,而Hunger应该是“fullness--”的函数。“Hunger{fullness--;};”应该是模仿代码中的“(function(){alert(“Hello”);”部分,但我对此有点困惑。@Cake_指挥官如果你只需要将fullness减少1,你可以删除Hunger{}
并将其替换为fullness--
在我的示例中。好吧,我想我现在基本上明白了。我是否应该将“function()”替换为如下所需的函数名?setInterval(饥饿(){if(fullness@Cake\u Commander,如果您想替换函数())对于您自己的函数名,您只需使用名称,如setInterval(饥饿,5000);
然后在函数饥饿(){if(完全
//Using a variable to store the timer reference that we create
hungerTimer = setInterval(updateHunger, 5000);
// ES6 features
const sleeper = (x, timeout) =>
new Promise(resolve => setTimeout(resolve, timeout, x));
function* timer(count, timeout) {
for (let i = count; i >= 0; i--) {
yield sleeper(i, timeout);
}
}
async function main() {
for (let i of timer(10, 1000)) {
console.log(await i); // Blocks the main() function but not the JS main thread!
}
}
main();
console.log("The call to main() was non-blocking");