我看了下百度现在能搜到的 无一例外都是向我们解释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 }