“node.js”中有定時器;“node.js”中的定時器模塊包含了一定時間執(zhí)行一遍代碼的函數(shù),定時器不必通過require()的方式引入,因為所有的方法都是模擬瀏覽器中JavaScript函數(shù),是全局的;“node.js”中的定時器函數(shù)實現(xiàn)了與web瀏覽器提供的定時器API類似的API。
本文操作環(huán)境:Windows10系統(tǒng)、nodejs 12.19.0版、Dell G3電腦。
node.js中有定時器
Node.js 中的定時器
Node.js 中的定時器模塊包含了隔一定時間執(zhí)行一遍代碼的函數(shù)。定時器不必通過 require() 的方式引入,因為所有這些方法都是模擬瀏覽器中 JavaScript 函數(shù),是全局的。為了更好的全面理解何時這些函數(shù)將執(zhí)行,閱讀 Node.js 中事件輪詢是一個好主意。
用 Node.js 控制時間的連續(xù)
Node.js 中的 API 函數(shù)提供了幾種方式,允許代碼從現(xiàn)在時間之后的某個時刻開始執(zhí)行。以下給出的函數(shù)看上去很相似,因為它們在大多數(shù)瀏覽器中都可用。但是 Node.js 實際上提供了它自己的實現(xiàn)。定時器與系統(tǒng)非常緊密地結合在一起,盡管這些 API 是瀏覽器中函數(shù)的翻版,但是仍然在實現(xiàn)上有所不同。
timer 用于安排函數(shù)在未來某個時間點被調用,Node.js 中的定時器函數(shù)實現(xiàn)了與 Web 瀏覽器提供的定時器 API 類似的 API,但是使用了事件循環(huán)實現(xiàn),Node.js 中有四個相關的方法
setTimeout(callback, delay[, ...args]) setInterval(callback[, ...args]) setImmediate(callback[, ...args]) process.nextTick(callback[, ...args])
示例如下:
setTimeout() 可被用來在一段指定時間之后執(zhí)行某個代碼任務。此函數(shù)與瀏覽器 JavaScript 函數(shù) window.setTimeout() 很相似,但是你不能把一串字符串傳入執(zhí)行。
setTimeout() 接受一個可執(zhí)行的函數(shù)作為其第一個參數(shù),然后有一個毫秒為單位的延時時間作為第二個參數(shù)。其余的參數(shù)也可納入其中,作為傳給此函數(shù)的參數(shù)使用。以下是一個例子:
function myFunc(arg) { console.log(`arg was => ${arg}`); } setTimeout(myFunc, 1500, 'funky');
因為使用了 setTimeout(),以上函數(shù) myFunc() 將在 1500 毫秒(或者1.5秒)左右時執(zhí)行。
設置的定時間隔不能保證每次都是以 精準 的毫秒間隔數(shù)執(zhí)行代碼,這是因為其它阻塞或者正在事件輪詢上處理的代碼將推遲此定時的執(zhí)行。唯一 保證的是定時器不會比聲明的時間間隔 提早 執(zhí)行。
setTimeout() 返回一個 Timeout 對象,可通過該對象引用到設置的定時器。這個返回的對象可以被用來取消定時(見下面的 clearTimeout() 部分),同時還可以改變執(zhí)行行為(見下面的 unref() 部分)。
"在此之后立即執(zhí)行" setImmediate()
setImmediate() 將在當前事件輪詢的末尾處執(zhí)行。 本代碼將在當前事件輪詢中的任何 I/O 操作 后,在任何下一輪定時器 前 執(zhí)行。代碼執(zhí)行可以被認為是“在此之后立即執(zhí)行”,這意味著任何緊跟著 setImmediate() 函數(shù)調用將在 setImmediate() 函數(shù)參數(shù)前執(zhí)行。
setImmediate() 的第一個參數(shù)是要執(zhí)行的函數(shù),當執(zhí)行時,后面的參數(shù)將作為參數(shù)傳入這個函數(shù)中。這是一個例子:
console.log('before immediate'); setImmediate((arg) => { console.log(`executing immediate: ${arg}`); }, 'so immediate'); console.log('after immediate');
傳入 setImmediate() 的上述函數(shù)將在任何可執(zhí)行的代碼執(zhí)行完后執(zhí)行,所以輸出結果是:
before immediate after immediate executing immediate: so immediate
setImmediate() 返回一個 Immediate 對象,它可以被用于取消安排的定時任務(見下面的 clearImmediate() )。
注意:不要把 setImmediate() 和 process.nextTick() 相混淆。它們有一些主要的差別:第一, process.nextTick() 將在任何設置好的 Immediate 以及任何安排好的 I/O 前 執(zhí)行。第二, process.nextTick() 是不可擦除的,換句話說,一旦有代碼使用 process.nextTick() 執(zhí)行,執(zhí)行無法中斷,這就像一個普通函數(shù)一樣,具體可以參考此教程來更好地理解 process.nextTick() 的操作。
"永遠的輪詢" 執(zhí)行 ~ setInterval()
如果存在一塊函數(shù),它需要多次執(zhí)行,setInterval() 可以派上用場。setInterval() 接受一個函數(shù)作為其參數(shù),該函數(shù)將被運行無限次,第二個參數(shù)便是一個給定的延時毫秒數(shù)。就像 setTimeout(),其余參數(shù)可以在這之后添加,作為傳遞給函數(shù)調用的參數(shù)使用。另外一個和 setTimeout() 類似的地方是延時不保證精確,因為有些操作可能在事件輪詢上掛住,因此可以被認為是大致的延時。如以下例子:
function intervalFunc() { console.log('Cant stop me now!'); } setInterval(intervalFunc, 1500);
在上面的例子中,intervalFunc() 每 1500 毫秒執(zhí)行一次(或每 1.5 秒執(zhí)行一次),直到它被終止。
就像 setTimeout(),setInterval() 同樣返回一個 Timeout 對象,它可以被引用并且改變設定的定時器。
推薦學習:《nodejs視頻教程》