今天又看了红宝石的二十二章高级定时器
高级定时器主要是为了解决重复定时器的调用问题。因为直接使用setIntervel方法会导致一些无法预测的问题出现。
主要思路是使用setTimeout的递归调用来代替setIntervel
首先,先明确一些基本概念:
明确执行队列:
执行进程<当前执行的代码>
任务队列<等待执行的代码>
明确定时器加入任务队列原理:
定时器的时间指的是定时器被加入到任务队列的时间,而不是执行的时间,并且如果任务队列中已经有一个相同的定时器,即使时间到了,定时器也不会被加入到任务队列中。
使用setTimeout的递归调用来代替setIntervel原因:
- 保证每次在执行定时器代码时都有一定的等待时间
- 避免定时器被跳过不执行
为什么没有等待时间呢?
如果前一个定时器在执行的时候,还没执行完,下一个定时器的时间到了,就被加入到了任务队列,这样,一旦在执行队列的定时器执行完,就会立刻被加入到执行队列。根本没有等待时间。
为什么会跳过呢?
如上所述,如果当前任务队列已经有一个id为time1的定时器(该定时器间隔是200ms),过了200ms后,另一个time1定时器想要加入到任务队列中,但是很可悲的是,任务队列中的定时器仍然在等执行进程中的代码执行,这样另一个time1定时器就会被跳过,再过200ms的时候会再次检测任务队列中有没有time1定时器,如果没有才加入下一个,如果有,就会继续跳过。