Nodejs中的計時器(setTimeout?setIntervals?etImmediate)使用案例解析
前言
今天我們先來學(xué)習(xí)兩個小知識點(diǎn),他們就是:
- 超時計時器:setTimeout
- 間隔計時器:setInterval
- 即時計時器:setImmediate
- process.nextTick()
學(xué)習(xí)路徑
- 超時計時器 setTimeout 的使用;
- 取消超時計時器;
- 間隔計時器 setInterval 的使用;
- 取消間隔計時器;
- 即時計時器:setImmediate
- process.nextTick()
- 計時器的一些特點(diǎn)(坑點(diǎn));
超時計時器 setTimeout 的使用;
超時計時器 setTimeout,作用是在延遲多久后執(zhí)行我們的代碼,是一次性的事件;
setTimeout 方法的接口規(guī)范;
setTimeout(callback,delayMillSeconds,[args]) // callback 為回調(diào)函數(shù)
setTimeout 方法的使用案例;
setTimeout(
(text) => {
console.log(text);
},
500,
"超時計時器 2 觸發(fā)并停止"
);或:
function timeoutExample(text: string) {
console.log(text);
}
setTimeout(timeoutExample, 500, "超時計時器 1 觸發(fā)并停止");

超時計時器
取消超時計時器;
當(dāng)我們設(shè)置了一個時長比較長的超時計時器,如何中途取消呢?例子如下:
void (async () => {
console.log(new Date());
console.log("超時計時器 3 開始倒計時");
const timer = setTimeout(
(text) => {
console.log(text);
},
30e3,
"超時計時器 3 觸發(fā)"
);
await sleep(2e3);
console.log(new Date());
console.log("取消超時計時器 3");
clearTimeout(timer);
console.log("超時計時器 3 停止");
})();

取消超時計時器
我們會看到,按我們的設(shè)計,2 秒鐘之后就將超時計時器停掉了,而不是等到 setTimeout 初始設(shè)置的 30 秒~
間隔計時器 setInterval 的使用;
間隔計時器 setInterval,作用是在每延遲多久后執(zhí)行我們的代碼,是重復(fù)性、循環(huán)性的事件;
setInterval 方法的接口規(guī)范;
setInterval(callback,delayMilliSecond,[args]) // callback 為回調(diào)函數(shù)
setTimeout 方法的使用案例;
(本例為:每隔 1 秒鐘執(zhí)行一次指令)
let count = 0;
function intervalExample() {
console.log(count);
count++;
}
setInterval(intervalExample, 1e3);
或:
let count = 0;
setInterval(function () {
console.log(count);
count++;
}, 1e3);
或傳參方式:
setInterval(
function (text: string) {
console.log(text);
},
1e3,
"Hello~"
);
取消間隔計時器;
const timer = setInterval(
function (text: string) {
console.log(text);
},
1e3,
"Hello~"
);
// sleep 方法是我自己寫的
await sleep(3e3);
clearInterval(timer);
或在指定時間后取消間隔計時器:
(5 秒鐘后取消間隔計時器)
const timer = setInterval(
function (text: string) {
console.log(text);
},
1e3,
"Hello~"
);
setTimeout(() => {
clearInterval(timer);
}, 5e3);
即時計時器:setImmediate
摘抄自網(wǎng)絡(luò)文章~
當(dāng)你想在 Nodejs 中執(zhí)行異步代碼,并且想盡可能快的執(zhí)行,那么可以選擇 Nodejs 中的 setImmediate() 函數(shù)。
任何傳給setImmediate()的函數(shù)參數(shù),都是在事件循環(huán)(event loop)的下一個迭代被調(diào)用執(zhí)行。
setTimeout()以0ms的延時執(zhí)行函數(shù)參數(shù),和setImmediate()類似,但是這兩個誰先執(zhí)行,取決于多種因素,但是這兩個都是在事件循環(huán)的下一個迭代被調(diào)用執(zhí)行。
用法如:
setImmediate(function () {
console.log("setImmediate...");
});
process.nextTick()
摘抄自網(wǎng)絡(luò)文章~
傳給process.nextTick()的函數(shù)參數(shù),是在事件循環(huán)的本次迭代最末尾執(zhí)行,當(dāng)前迭代的其他操作結(jié)束立刻執(zhí)行該函數(shù)參數(shù)。這意味著process.nextTick()執(zhí)行總是早于setImmediate()和setTimeout().
這幾個計時器的執(zhí)行順序我們親自實(shí)驗(yàn)一下:
console.log(111);
setTimeout(function () {
console.log("setTimeout...");
}, 0);
process.nextTick(function () {
console.log("nextTick...");
});
setImmediate(function () {
console.log("setImmediate...");
});
console.log(222);
await sleep(1e3);
console.log(333);

幾個計時器的執(zhí)行順序
我們會看到其他非阻塞的命令會先執(zhí)行,然后是 process.nextTick(),接著是 setImmediate,然后是 setTimeout(此處演示延遲為 0 的時候),最后是其他阻塞的命令;
這樣就很清晰了吧~
計時器的一些特點(diǎn)(坑點(diǎn));
1. setInterval 是異步方法,當(dāng) callback 函數(shù)發(fā)生阻塞,間隔計時器并不會被阻塞;
2. 由于 setInterval 是異步方法,間隔計時器并不會被 callback 函數(shù)阻塞,因此當(dāng) callback 函數(shù)發(fā)生報錯,間隔計時器并不會拋錯而停止,例如:
setInterval(
async function (text: string) {
console.log(text);
await sleep(3e3);
throw new Error("This is an error!");
},
1e3,
"Hello~"
);

異步、不拋錯
可以看到指令一直在執(zhí)行,并不會因拋錯而停止~
這樣的異步和不拋錯,在某些場景下可能還是會詫異,記錄一下~
setTimeout 和 setInterval 執(zhí)行時間是不精確的。
function simpleTimeout(consoleTime) {
console.timeEnd(consoleTime);
}
console.time("50MillSecond");
setTimeout(simpleTimeout, 50, "50MillSecond");
console.time("oneSecond");
setTimeout(simpleTimeout, 1000, "oneSecond");
console.time("twoSecond");
setTimeout(simpleTimeout, 2000, "twoSecond");
console.time("fiveSecond");
setTimeout(simpleTimeout, 5000, "fiveSecond");

執(zhí)行時間不精確
其他待后續(xù)記錄~
以上就是Nodejs中的計時器使用案例解析的詳細(xì)內(nèi)容,更多關(guān)于Nodejs計時器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
node.js調(diào)用腳本(python/shell)和系統(tǒng)命令
這篇文章介紹了node.js調(diào)用腳本(python/shell)和系統(tǒng)命令的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
nodejs中簡單實(shí)現(xiàn)Javascript Promise機(jī)制的實(shí)例
這篇文章主要介紹了nodejs中簡單實(shí)現(xiàn)Javascript Promise機(jī)制的實(shí)例,本文在nodejs中簡單實(shí)現(xiàn)一個promise/A 規(guī)范,需要的朋友可以參考下2014-12-12
node+experss實(shí)現(xiàn)爬取電影天堂爬蟲
本文給大家分享的是node+experss制作爬蟲的第二篇,我們來爬取電影天堂最新更新的電影迅雷下載鏈接,有需要的小伙伴可以參考下2016-11-11
Nodejs進(jìn)階:基于express+multer的文件上傳實(shí)例
本篇文章主要介紹了基于express+multer的文件上傳實(shí)例,現(xiàn)在分享給大家,也給大家做個參考,感興趣的小伙伴們可以參考一下。2016-11-11
簡單聊一聊Node.js參數(shù)max-old-space-size
簡單的說Node.js就是運(yùn)行在服務(wù)端的JavaScript,下面這篇文章主要給大家介紹了關(guān)于Node.js參數(shù)max-old-space-size的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01

