其實這片文章剛開始我啥也沒寫的,但也有20多的訪問量,所以覺得大家還是比較關注這個問題,所以找機會寫下。
問題的引出:
為什么我說的時webapp中慎用setInterval、setTimeout, 既然這么說肯定時要強調兩點:
1、 webapp 下, 這里的webapp我主要想說的時單頁應用(SPA)
2、 慎用, 慎用說明還是可以用的,但要注意。
一、 我們知道 setInterval、setTimeout 時基於 window下的。 看截圖
而SPA項目又有一個特別的地方就是切換頁面時,整個頁面時不會重新刷新的,以 setInterval 為例,最常見的就是 登入頁面60s短信驗證碼。當你在60s之內你已經完成登入操作了,並且跳轉到別的頁面,而因為時spa項目,window是不會刷新的,所以即使你跳轉到別的頁面,你的 setInterval 還在運行, 就算你代碼中 用了clearInterval,但也是要60s 之后才會去清除,而此時你早已經登入成功去做別的了, 當你設置的時間過多,或者你的項目中使用setInterval、setTimeout過多。 對你手機內存消耗時不可小覷的,會影響用戶流暢度。
問題解決:
那怎么解決呢: 很簡單,就是你跳轉頁面的時候去主動 clearInterval 一下, 這個時候你就要統一的去管理所有 setTimeout setInterval 生成的timer。
window.app = { timers : [] }; var timer = setInterval(function( ) {console.info('a')}, 1000); app.timers.push(timer); var timer1 = setInterval(function( ) {console.info('b')}, 1000); app.timers.push(timer1);
//當你頁面跳轉時,統一去 clearInterval, 因為一般做單頁的,跳轉等函數都是封裝的了,你只要在封裝的地方加上下面的代碼就可以了。
app.timers.forEach(function (item) {
clearInterval(item);
});
上面的代碼都是自己直接 手寫的,連編輯器都沒用,不確保正常跑起來, 但思路就是這么個意思,這篇文章也主要是講這么個思路,拋磚引玉之用, 希望能舉一反三, 對webapp下的其它全局函數是不是也要注意這個問題呢? 大家可以一起探討。