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()了。
轉載于:https://www.cnblogs.com/eco-just/p/9160817.html
總結
以上是生活随笔為你收集整理的setInterval(callback(),time)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 对象数组去重
- 下一篇: [AHOI2008] 紧急集合