setInterval(callback(),time)
最近在寫一個需求的時候,出了點小小的問題,在這做個記錄。
對于定時函數(shù)setInterval()大家應(yīng)該都不陌生,setInterval(callback(),time)就是說設(shè)置一個定時器,每隔time時間,
(當然這個時間是以毫秒計算的,1秒=1000毫秒)執(zhí)行一次回調(diào)callback();
我剛開始這么寫的代碼:
function forbidden(){var time = 60;$('.getSms').attr('disabled','disabled');if(time>0){var timer = setInterval(function(){$('.getSms').text(time+'秒后重新發(fā)送');time--;};1000);}else{window.clearInterval(timer); $('.getSms').text('發(fā)送短信');$('.getSms').attr('disabled',false);}當時是這么想的,單擊發(fā)送短信按鈕觸發(fā)forbidden(),初始化一個變量time=60,并且此時按鈕不可用,然后判斷:如果
time大于0,執(zhí)行定時器timer(time--),等到time小于等于0的時候,清除定時器,按鈕的顯示文字也改變,并且變?yōu)榭捎?#xff0c;
好像一切都是這么地呵護邏輯,但是!!!點擊按鈕之后,看著上面的數(shù)字由60一點一點地減,減到0之后,變成了-1,-2...
瞬間懵逼了,于是就在else語句里面打一個console.log(time),然后再跑一遍,等到數(shù)據(jù)為-1的時候,控制臺沒打印time值,
然后意識到,這個定時函數(shù)一直在跑,time=-1的時候,并沒有進行判斷,于是~~~~把time的判斷放到callback()里面,像這樣:
function forbidden(){var time = 60;$('.getSms').attr('disabled','disabled');var timer = setInterval(function(){$('.getSms').text(time+'秒后重新發(fā)送');time--;if(time<0){console.log(time);window.clearInterval(timer); $('.getSms').text('發(fā)送短信');$('.getSms').attr('disabled',false);}}, 1000);}然后,問題解決。
事后,覺得可以這么理解,定時函數(shù)是一個獨立的空間,一旦開啟,就一直執(zhí)行(對后續(xù)代碼段造成阻塞),然而我們在定時器后
面規(guī)定,time<0的時候,清除定時器,這句代碼壓根一直都沒執(zhí)行,又怎么會生效呢,放在callback()里面就不一樣了,每隔1秒執(zhí)行
一次callback(),每執(zhí)行一次callback()就會判斷了,time是不是小于0啊,不是的話待會還是要執(zhí)行callback(),如果是的話,待會就
不執(zhí)行這個callback()了。
轉(zhuǎn)載于:https://www.cnblogs.com/eco-just/p/9160817.html
總結(jié)
以上是生活随笔為你收集整理的setInterval(callback(),time)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 对象数组去重
- 下一篇: [AHOI2008] 紧急集合