Timer

关于Timer,最核心的api 就是 setTimeoutclearTimeout。本文将会以这两个函数作为展开来分析node.js 是怎么实现这两个api。

API

对于setTimout 相信很多人都会觉得很熟悉它的用法,函数的主要功能是,间隔一定秒数,执行回调函数。
然而,需要提醒的是,因为很多同学是从前端转过来的,所以会忽略了 在node.js 里面 setTimeout 可以传参数的特性

setTimeout(callback, delay[, arg][, ...])

setTimeout(function (a, b) {
    console.log(a, b); // 1, 2
}, 100, 1, 2);

实现原理

setTimeout 会创建一个timer对象,timer对象的底层实现由libuv 的 uv_timer_init 负责,检查是否存在二叉树,如果二叉树不存在,创建二叉树,利用uv_timer_start方法启动定时器,并将js编写的回调的方法绑定到uv_timer_start的回调事件里,如果二叉树已经存在,并将其插入一个二叉树里面,二叉树,是按照定时间隔,从小到大排列。

uv_timer_start 到达时间后,将会执行创建时候约定好的回调函数,并查看二叉树里面,下一个,离现在最近将要执行的函数,将其提取,并执行uv_timer_start 方法,让它在过了某一段时间后,执行回调函数,不断循环上述过程,直到二叉树为空,便停止。

setTimeout的实现就告一段落了。

后记

我真的不是故意忘记clearTimeout这个api,而是我觉得真的非常重要,所以才摆到后记位置,前文说了,node.js利用uv_timer_init 创建了timer 结构,所以为了让这个结构对象,释放内存,就必须使用clearTimeout进行销毁,所以大家在调用setTimeout 谨记调用clearTimeout,否则会产生内存泄漏。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前天nodejs发布了新版本4.0,其中涉及到一个更新比较多的模块,那就是下面要介绍的timer模块。 timer...
    淘小杰阅读 848评论 1 1
  • 多线程计时器 多线程计时器比较强大,精确,而且可扩展性强; 只要在使用Timer,就必须保留对它的引用。对于任何托...
    LH_晴阅读 5,612评论 0 0
  • 更详细的讲解和代码调试演示过程,请点击链接 做过系统编程的人都知道,几乎任何系统都会提供一种时钟机制,也就是Set...
    望月从良阅读 833评论 0 1
  • 1、感恩真我派昆辉SKY两位能量级选手来和我共振高能量,好被滋养和宠爱,开心!感谢两位天使爱的供养与陪伴,感谢我们...
    张艾雯阅读 295评论 0 0
  • 今天由我来为大家讲一堂,售前售中售后课程,是我们做好养森的先提条件。希望大家认真领会。 其实呢,这还是在售前工作,...
    Li文娟阅读 375评论 0 0