• setInterval(callback(),time)


    最近在写一个需求的时候,出了点小小的问题,在这做个记录。

    对于定时函数setInterval()大家应该都不陌生,setInterval(callback(),time)就是说设置一个定时器,每隔time时间,

    (当然这个时间是以毫秒计算的,1秒=1000毫秒)执行一次回调callback();

    我刚开始这么写的代码:

    function forbidden(){
              var time = 60;
              $('.getSms').attr('disabled','disabled');
          if(time>0){
                    var timer = setInterval(function(){
                        $('.getSms').text(time+'秒后重新发送');
                        time--;
                };1000);
          }else{
                    window.clearInterval(timer);  
                    $('.getSms').text('发送短信');
                    $('.getSms').attr('disabled',false);
              } 

    当时是这么想的,单击发送短信按钮触发forbidden(),初始化一个变量time=60,并且此时按钮不可用,然后判断:如果

    time大于0,执行定时器timer(time--),等到time小于等于0的时候,清除定时器,按钮的显示文字也改变,并且变为可用,

    好像一切都是这么地呵护逻辑,但是!!!点击按钮之后,看着上面的数字由60一点一点地减,减到0之后,变成了-1,-2...

    瞬间懵逼了,于是就在else语句里面打一个console.log(time),然后再跑一遍,等到数据为-1的时候,控制台没打印time值,

    然后意识到,这个定时函数一直在跑,time=-1的时候,并没有进行判断,于是~~~~把time的判断放到callback()里面,像这样:

    function forbidden(){
                    var time = 60;
                    $('.getSms').attr('disabled','disabled');
                    var timer = setInterval(function(){
                        $('.getSms').text(time+'秒后重新发送');
                        time--;
                        if(time<0){
                            console.log(time);
                            window.clearInterval(timer);  
                            $('.getSms').text('发送短信');
                            $('.getSms').attr('disabled',false);
                        }
                    }, 1000);
                } 

    然后,问题解决。

    事后,觉得可以这么理解,定时函数是一个独立的空间,一旦开启,就一直执行(对后续代码段造成阻塞),然而我们在定时器后

    面规定,time<0的时候,清除定时器,这句代码压根一直都没执行,又怎么会生效呢,放在callback()里面就不一样了,每隔1秒执行

    一次callback(),每执行一次callback()就会判断了,time是不是小于0啊,不是的话待会还是要执行callback(),如果是的话,待会就

    不执行这个callback()了。

  • 相关阅读:
    bzoj3729-Gty的游戏【Splay,博弈论】
    pkusc2021游记
    P4922-[MtOI2018]崩坏3?非酋之战!【dp】
    P5782-[POI2001]和平委员会【2-SAT】
    CF1511G-Chips on a Board【倍增】
    noip范围
    [LGOJ5558]心上秋(倍增)
    学习笔记——动态DP
    [NOIP校内集训]不正常的国家
    [BZOJ4712]洪水(树链剖分+DP)
  • 原文地址:https://www.cnblogs.com/eco-just/p/9160817.html
Copyright © 2020-2023  润新知