前言: setTimeout和setInterval在第一次遇到的时候,都会直接添加进入任务队列,然后等待延迟执行,此后每隔timeout,setInterval会往任务队列里添加一次任务。
第一次执行会直接添加任务队列的证明:
setInterval(() => {
console.log(1);
}, 1000);
setTimeout(() => {
console.log(2);
}, 1000);
在上述代码中,1s后1,2会同时打出,所以是执行到它的时候,直接添加进了任务队列才会执行到setTimout添加任务队列,一起等待了1s
区别
区别在于每次遇到setTimout,都会将任务添加进入任务队列,而setInterval添加完第一次后,就会每隔timeout向任务队列添加一次,如果在这个过程中,有上一次添加的setInterval没有执行,就不会添加,会导致有任务被遗漏的问题,证明代码如下:
console.log(Date.now());
let date = new Date().getTime();
while (Date.now() - date < 3000) {}
console.log('等待结束:', Date.now());
setInterval(() => {
console.log('setInterval,', Date.now());
}, 1000);
setTimeout(() => {
console.log('setTimeout,', Date.now());
let date = new Date().getTime();
while (Date.now() - date < 3000) {}
console.log('setTimeout,', Date.now());
}, 1000);
上述代码中,会发现,打印出“等待结束”后,等待1s同时打印setInterval,setTimeout,然后等待3s后,setTimeout里面的任务执行完成,才会再去打印setInterval里面的时间,中间第2s的时间未能打印出来,被遗漏了。