关于Timer,最核心的api 就是 setTimeout
和 clearTimeout
。本文将会以这两个函数作为展开来分析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
,否则会产生内存泄漏。
网友评论