美文网首页让前端飞
红宝石二十二章高级定时器

红宝石二十二章高级定时器

作者: 向布谷鸟说早安 | 来源:发表于2018-11-12 21:49 被阅读6次

    今天又看了红宝石的二十二章高级定时器
    高级定时器主要是为了解决重复定时器的调用问题。因为直接使用setIntervel方法会导致一些无法预测的问题出现。

    主要思路是使用setTimeout的递归调用来代替setIntervel

    首先,先明确一些基本概念:

    明确执行队列:

    执行进程<当前执行的代码>
    任务队列<等待执行的代码>

    明确定时器加入任务队列原理:

    定时器的时间指的是定时器被加入到任务队列的时间,而不是执行的时间,并且如果任务队列中已经有一个相同的定时器,即使时间到了,定时器也不会被加入到任务队列中。

    使用setTimeout的递归调用来代替setIntervel原因:
    1. 保证每次在执行定时器代码时都有一定的等待时间
    2. 避免定时器被跳过不执行
    为什么没有等待时间呢?

    如果前一个定时器在执行的时候,还没执行完,下一个定时器的时间到了,就被加入到了任务队列,这样,一旦在执行队列的定时器执行完,就会立刻被加入到执行队列。根本没有等待时间。

    为什么会跳过呢?

    如上所述,如果当前任务队列已经有一个id为time1的定时器(该定时器间隔是200ms),过了200ms后,另一个time1定时器想要加入到任务队列中,但是很可悲的是,任务队列中的定时器仍然在等执行进程中的代码执行,这样另一个time1定时器就会被跳过,再过200ms的时候会再次检测任务队列中有没有time1定时器,如果没有才加入下一个,如果有,就会继续跳过。

    相关文章

      网友评论

        本文标题:红宝石二十二章高级定时器

        本文链接:https://www.haomeiwen.com/subject/uhdhfqtx.html