其实这个问题本身是由于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 } 20 // 业务也可以写这里 21 }, 1000) 22 } 23 24 function someMethod(params){ 25 //balabala 26 }