我看了下百度現在能搜到的 無一例外都是向我們解釋clearInterval的意思,沒有解決根本問題!
其實這個問題本身是由於js定時器特性產生的。
clearInterval是根據定時器本身的標識來進行清除的,如果在期間生成了新的interval,並覆蓋timer標識對象,舊有的timer定時器對象並不會被停止和清除,而且標識也會丟失導致再也無法被清除,所以寫定時器時一定要注意。
所以在外部調用某個定時器任務的函數的時候,一定一開始就把之前的定時器清除!
下面是一個正確范例:
1 var ajaxObj = null;//ajax異步加載的對象 2 var timer = null;//定時器標識 3 4 loadTimerWhenSthIsReady(params1);//外部調用定時任務 5 6 ///param是外部參數,這里僅是舉例 7 function loadTimerWhenSthIsReady(params) { 8 //一定要先清掉之前的定時器,如果出現兩次調用的情況可能導致生成兩個定時器。 9 //因為timer本身只是定時器標記並不是定時器對象,所以覆蓋並不會讓timer停止,舊的timer會一直執行停不下來 10 clearInterval(timer); 11 timer = null; 12 13 timer = setInterval(function () { 14 if (ajaxObj != null) { 15 clearInterval(timer); 16 timer = null; 17 //此處寫等待某對象加載的業務邏輯,一旦ajaxObj加載完畢則開始執行且只執行一次 18 someMethod(params); 19 return; 20 } 21 //定時業務寫這里,此時ajaxObj相當於某種條件,一旦條件達成則停止定時器 22 }, 1000) 23 } 24 25 function someMethod(params) { 26 //balabala 27 }