Javascript 使用setInterval随时间以增量减少变量

Javascript 使用setInterval随时间以增量减少变量,javascript,html,Javascript,Html,所以现在,我是一名编码初学者,我对setInterval命令有很多问题。我想做的是有一个函数,每经过5秒,就把一个变量减少1。然而,尽管我查看了许多不同的线程,并提供了有关setInterval命令的信息,但它们似乎都不符合我的需要(尽管我可能错过了一些东西),而且我无法操纵在其他地方看到的任何东西来执行我的功能 while (fullness <= 10) { setInterval(hungry{ fullness--; }, 1000); } while(fullness您

所以现在,我是一名编码初学者,我对setInterval命令有很多问题。我想做的是有一个函数,每经过5秒,就把一个变量减少1。然而,尽管我查看了许多不同的线程,并提供了有关setInterval命令的信息,但它们似乎都不符合我的需要(尽管我可能错过了一些东西),而且我无法操纵在其他地方看到的任何东西来执行我的功能

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 is
Hunger
?您打算将其作为一个函数调用吗?您是否理解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");