關(guān)于Timer,最核心的api 就是 setTimeout
和 clearTimeout
。本文將會以這兩個函數(shù)作為展開來分析node.js 是怎么實現(xiàn)這兩個api苔埋。
API
對于setTimout
相信很多人都會覺得很熟悉它的用法嘲叔,函數(shù)的主要功能是亡呵,間隔一定秒數(shù),執(zhí)行回調(diào)函數(shù)借跪。
然而政己,需要提醒的是,因為很多同學(xué)是從前端轉(zhuǎn)過來的掏愁,所以會忽略了 在node.js 里面 setTimeout 可以傳參數(shù)的特性
setTimeout(callback, delay[, arg][, ...])
setTimeout(function (a, b) {
console.log(a, b); // 1, 2
}, 100, 1, 2);
實現(xiàn)原理
setTimeout 會創(chuàng)建一個timer對象歇由,timer對象的底層實現(xiàn)由libuv 的 uv_timer_init 負(fù)責(zé),檢查是否存在二叉樹果港,如果二叉樹不存在沦泌,創(chuàng)建二叉樹,利用uv_timer_start
方法啟動定時器辛掠,并將js編寫的回調(diào)的方法綁定到uv_timer_start
的回調(diào)事件里谢谦,如果二叉樹已經(jīng)存在,并將其插入一個二叉樹里面萝衩,二叉樹回挽,是按照定時間隔,從小到大排列猩谊。
當(dāng) uv_timer_start
到達(dá)時間后千劈,將會執(zhí)行創(chuàng)建時候約定好的回調(diào)函數(shù),并查看二叉樹里面牌捷,下一個墙牌,離現(xiàn)在最近將要執(zhí)行的函數(shù),將其提取暗甥,并執(zhí)行uv_timer_start
方法喜滨,讓它在過了某一段時間后,執(zhí)行回調(diào)函數(shù)撤防,不斷循環(huán)上述過程虽风,直到二叉樹為空,便停止。
setTimeout的實現(xiàn)就告一段落了焰情。
后記
我真的不是故意忘記clearTimeout
這個api陌凳,而是我覺得真的非常重要,所以才擺到后記位置内舟,前文說了,node.js利用uv_timer_init 創(chuàng)建了timer 結(jié)構(gòu)初橘,所以為了讓這個結(jié)構(gòu)對象验游,釋放內(nèi)存,就必須使用clearTimeout
進(jìn)行銷毀保檐,所以大家在調(diào)用setTimeout
謹(jǐn)記調(diào)用clearTimeout
耕蝉,否則會產(chǎn)生內(nèi)存泄漏。