Timer

作者: 忧郁的河蟹 | 来源:发表于2015-04-27 00:27 被阅读154次

    关于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,否则会产生内存泄漏。

    相关文章

      网友评论

          本文标题:Timer

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