嘭,setTimeout炸了

今天要說的很簡單,沒有setTimeout的基本用法,也沒有什麼特殊用法。前端

就是想記錄一下setTimeout的一個特殊狀況,分享給可能也不知道的大家。markdown

setTimeout的基本寫法你們都不陌生,以下:測試

setTimeout(() => {
    // 說,你倒計時想幹什麼
}, millisecond)
複製代碼

其中第二個參數是須要延時執行的毫秒數,你們應該都知道這個時間是不許確的,能夠理解爲最短延時。至於爲何是不許確,事件循環瞭解一下。spa

可是這個最短延時也會騙人,由於它可能會爆炸 😂。調試

今天跟測一個項目,前端須要經過延時的方式去顯示某課程是否開始,未開始展現倒計時界面,倒計時至開始時去掉倒計時界面,拉取主體內容。code

可是測試小姐姐反饋說她的課程沒有開始,沒有顯示倒計時,直接就顯示主內容。而且沒有復現步驟,只此一例。orm

我表示很詫異,可是也沒辦法。因而使出十八般武藝,開始在測試環境打斷點調試,分析代碼邏輯。好半天以後,納尼,邏輯確定是對的,我相信個人判斷。事件

而後我忽然開始懷疑setTimeout的倒計時時間問題。因而開始查,最後查到了緣由,真的是這貨的鍋,它由於延時時間過長,炸了。產品

這就是今天的重點:setTimeout 的延時毫秒數是有限制的millisec 參數是 Int32 類型的,最大值爲 2^31 - 1,即 2147483647。一旦超過這個限制,millisec 參數將被視爲 0,代碼會被立馬執行it

setInterval 也同樣,毫秒數過大會被當作 0,當即執行。

至於解決方案也比較簡單,有如下兩種:

  1. 能夠對 setTimeout 進行二次封裝,對傳入的延時毫秒數作個判斷,若是超出限制,給出警告,並使用最大容許延時毫秒進行執行、或者給出警告後不執行。相信我,沒有人會等得了這麼長時間的。
  2. 從產品層面解決這個問題,若是等待時間過長,能夠用其餘的方式來提醒。則不須要倒計時了。

感謝污師葵的評論提問,特此補上解決方案

看完以後,之後若是你也遇到setTimeout失靈的狀況,記得想起這茬。


若是你喜歡,歡迎掃碼關注個人公衆號,我會按期陪讀,並分享一些其餘的前端知識喲。

相關文章
相關標籤/搜索