2015年7月22日 星期三

瀏覽器會自動休眠:對 setTimeout 和 setInterval 的影響

現在的瀏覽器越來越聰明,在最近 Chrome 的版本中,只要使用者切換到另一個 tab (頁籤),原本的 tab  (在此稱 unfocused 或 inactive tab) 就會進入休眠狀態。它有在執行,但是很緩慢。在 StackOverflow 也查到類似的災情。瀏覽器這麼做就可以大幅的節省 CPU 使用率,省電、進而節能減碳,讓地球永生。不單是 PC ,就連手機用戶,瀏覽器休眠更是家常便飯,手機使用者可能會常切到別的 APP ,或者是在路上反覆的對手機做開關的動作。

那對前端程式 javascript 又有什麼影響呢?
使用 setTimeout 或者是 setInterval 就會影響很大。對於 setTimeout ,經測試,執行 function 的時間是不變的,步驟如下:

  1. 假設 setTimeout 的時間為 300 * 1000 (五分鐘)
  2. 在這五分鐘的期間,可以 休眠、關閉手機,或是切換到別的 tab
  3. 五分鐘後,function 會準時被 fire ,但如果此時是切換到別的 tab ,被 fire 的 function 會執行很慢,可能原本 1ms 就可以跑完的,要跑 100ms 都不太意外。
  4. 但是如果五分鐘後,你的手機是關閉或是電腦是休眠,那當然就不會執行。

至於 setInterval ,如果你是每秒一定要執行一次的東西,如果中間手機關閉一分鐘,一分鐘後讓手機回神過來,並不會給你補個60槍。你可能設定每秒跑一次,預期60秒要增加60次,執行結果會變成只增加 55 次。

因此,如果要在頁面上呈現數位時鐘,那建議以時間差來做計算,頁面時間差一秒,會被客訴的。