【问题标题】:setinterval vs settimeout设置间隔与设置超时
【发布时间】:2017-11-15 07:22:36
【问题描述】:

如何在每天早上 7:50 运行倒计时 10 分钟,直到每天早上 8:00。之后,班次将关闭。计时器将作为完成工作的警告。

我使用不同风格的 setinterval 和 settimeout 代码 sn-ps 已经有几个小时了。但我不知道如何进行。我的主要问题是使用 setinterval 或 setimeout。

1) setinterval: 每隔几分钟检查一下时间是 7:50 可以吗?

2) settimeout:可以计算一天中的秒数吗?然后在这些秒后继续调用该函数?

这对我有用

window.setInterval(function() {
    var date = new Date();
    if (date.getHours() === 8 && date.getMinutes() === 0) {}
}, 60000);



var now = new Date();
var millisTill10 = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 10, 0, 0, 0) - now;
if (millisTill10 < 0) {
    millisTill10 += 86400000;
}
setTimeout(function() {
    alert("It's 10am!")
}, millisTill10);

【问题讨论】:

  • "jquery setinterval vs settimeout" setIntervalsetTimeout 与 jQuery 没有任何关系。
  • 你能把你的代码分享给我们吗?

标签: javascript


【解决方案1】:

每分钟运行一个计时器。如果当前时间在您的分配范围内,请显示您的警告。这段代码的问题在于它只能精确到一分钟,而不是精确到一秒。

每秒运行一次并不是一个好习惯。

setInterval(function(){

   var d = new Date();
   var h = d.getHours();
   var m = d.getMinutes();

   //Rough estimation for the time between 7.50 and 8.00 here
   if (h === 7 && m >= 50) 
      console.log('Warning!');     


}, 1000)

现在我们可以做更多...

我们可以让上面的例程启动一个超时功能,该功能将在间隔内精确。它会在正确的时间触发倒数计时器,并将闹钟设置为另外 24 小时。

var starter = setInterval(function(){

   var d = new Date();
   var h = d.getHours();
   var m = d.getMinutes();

   //Rough estimation for the time between 7.50 and 8.00 here
   if (h === 7 && m >= 50) 
      setTimeout(timer24(), 1000 * 60 * 24)  


}, 1000)


function timer24(){

   //Warn every 10 seconds
   var countdown = setInterval(function(){

       console.log('Warning!'); 

       var d = new Date();
       var h = d.getHours();

       if (h == 8)
          clearInterval(countdown)   

    }, 10)

    setTimeout(timer, 1000 * 60 * 24)

}

【讨论】:

    【解决方案2】:

    setInterval 用于在给定时间重复回调函数,setTimeout 用于在特定时间后运行回调。由于需要创建计数器,可以在这里使用setInterval

    注意:如果要在 10 分钟内每隔 scond 显示一次用户,可以使用 1000 作为间隔计时值。但是如果你想在 10 分钟的持续时间内显示每一分钟,那么使用 60 * 1000 作为间隔计时值会更好。

    setInterval(function(){
       var dateNow = new Date();
       if(dateNow.getHours() >= 7 && 
          dateNow.getMinutes >= 50 && 
          dateNow.getHours < 8)
       {
           // if the alert box isn't displayed yet
           // display it first.
           // update the display.
       }else{
           // if the alert box is displayed
           // hide it
       }
    }, 1000); // or 1000 * 60 for minute based display
    

    【讨论】:

    • 每秒运行一次就可以了?
    • 是的,因为它不会执行超过 1 秒的任何内容。
    • @maztt 你可以使用clearInterval() 删除间隔,如果你不想
    • 但是如果 OP 想要在 7:49 之后向用户显示警报并且用户也在页面上停留 2 分钟,那么 OP 应该保持运行。
    • 关于setInterval内存和cpu消耗的疑惑:softwareengineering.stackexchange.com/a/183727/50293
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多