以前一直没有弄懂 setTimeout 和 setInterval,现在遇到一个题目,查了许久,记录下来方便之后查看。javascript
setTimeout :mdn解释该方法设置一个定时器,该定时器在定时器到期后执行一个函数或指定的一段代码。java
setInterval:方法重复调用一个函数或执行一个代码段,在每次调用之间具备固定的时间延迟。函数
以前认为二者的区别就是一个只是运行一次,另外一个一直运行,如今看来太天真; 对象
通常的场景下使用两种方法没有问题,可是遇到一个事情,就是在定时器中调用一个接口,判断用户是否扫码登录。blog
仔细排查了,是由于我使用了setInterval,都说setTimeout 不许确,其实setInterval 在某些状况也不许确,在时间上,setInterval 是很准确可是,他不会管其余的事情,到点就下班。。。。接口
假设有个函数须要调用,返回为true的时候,中止定时器。ip
setInterval 会按照固定时间容许该函数,若是这个函数超时了,那么在n次中就会忽略改函数的返回true,在某些应用场景中这是致命的io
setTimeout 的不许确也是会由于该函数超时了,以前也没有调用方法console
上个栗子这样看的就直观了不少function
/** * 一、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1 * 二、返回的对象中须要包含一个 cancel 方法,用于中止定时操做 * 三、第一个数须要当即输出 **/ function count(start, end) { if (start <= end) { console.log(start); start++; st = setTimeout(function() { count(start, end); }, 1000) }; return { cancel: function() { clearTimeout(st) } } } count(1, 10)