Timer

關(guān)于Timer,最核心的api 就是 setTimeoutclearTimeout。本文將會以這兩個函數(shù)作為展開來分析node.js 是怎么實現(xiàn)這兩個api。

API

對于setTimout 相信很多人都會覺得很熟悉它的用法,函數(shù)的主要功能是,間隔一定秒數(shù),執(zhí)行回調(diào)函數(shù)。
然而,需要提醒的是,因為很多同學是從前端轉(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 負責,檢查是否存在二叉樹,如果二叉樹不存在,創(chuàng)建二叉樹,利用uv_timer_start方法啟動定時器,并將js編寫的回調(diào)的方法綁定到uv_timer_start的回調(diào)事件里,如果二叉樹已經(jīng)存在,并將其插入一個二叉樹里面,二叉樹,是按照定時間隔,從小到大排列。

uv_timer_start 到達時間后,將會執(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進行銷毀,所以大家在調(diào)用setTimeout 謹記調(diào)用clearTimeout,否則會產(chǎn)生內(nèi)存泄漏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前天nodejs發(fā)布了新版本4.0,其中涉及到一個更新比較多的模塊,那就是下面要介紹的timer模塊。 timer...
    淘小杰閱讀 896評論 1 1
  • 多線程計時器 多線程計時器比較強大,精確,而且可擴展性強; 只要在使用Timer,就必須保留對它的引用。對于任何托...
    LH_晴閱讀 5,720評論 0 0
  • 更詳細的講解和代碼調(diào)試演示過程,請點擊鏈接 做過系統(tǒng)編程的人都知道,幾乎任何系統(tǒng)都會提供一種時鐘機制,也就是Set...
    望月從良閱讀 891評論 0 1
  • 1、感恩真我派昆輝SKY兩位能量級選手來和我共振高能量,好被滋養(yǎng)和寵愛,開心!感謝兩位天使愛的供養(yǎng)與陪伴,感謝我們...
    張艾雯閱讀 332評論 0 0
  • 今天由我來為大家講一堂,售前售中售后課程,是我們做好養(yǎng)森的先提條件。希望大家認真領(lǐng)會。 其實呢,這還是在售前工作,...
    Li文娟閱讀 404評論 0 0

友情鏈接更多精彩內(nèi)容