Nodejs中的計時器(setTimeout?setIntervals?etImmediate)使用案例解析
前言
今天我們先來學習兩個小知識點,他們就是:
- 超時計時器:setTimeout
- 間隔計時器:setInterval
- 即時計時器:setImmediate
- process.nextTick()
學習路徑
- 超時計時器 setTimeout 的使用;
- 取消超時計時器;
- 間隔計時器 setInterval 的使用;
- 取消間隔計時器;
- 即時計時器:setImmediate
- process.nextTick()
- 計時器的一些特點(坑點);
超時計時器 setTimeout 的使用;
超時計時器 setTimeout,作用是在延遲多久后執(zhí)行我們的代碼,是一次性的事件;
setTimeout 方法的接口規(guī)范;
setTimeout(callback,delayMillSeconds,[args]) // callback 為回調函數(shù)
setTimeout 方法的使用案例;
setTimeout( (text) => { console.log(text); }, 500, "超時計時器 2 觸發(fā)并停止" );
或:
function timeoutExample(text: string) { console.log(text); } setTimeout(timeoutExample, 500, "超時計時器 1 觸發(fā)并停止");
超時計時器
取消超時計時器;
當我們設置了一個時長比較長的超時計時器,如何中途取消呢?例子如下:
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 停止"); })();
取消超時計時器
我們會看到,按我們的設計,2 秒鐘之后就將超時計時器停掉了,而不是等到 setTimeout 初始設置的 30 秒~
間隔計時器 setInterval 的使用;
間隔計時器 setInterval,作用是在每延遲多久后執(zhí)行我們的代碼,是重復性、循環(huán)性的事件;
setInterval 方法的接口規(guī)范;
setInterval(callback,delayMilliSecond,[args]) // callback 為回調函數(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)絡文章~
當你想在 Nodejs 中執(zhí)行異步代碼,并且想盡可能快的執(zhí)行,那么可以選擇 Nodejs 中的 setImmediate() 函數(shù)。
任何傳給setImmediate()的函數(shù)參數(shù),都是在事件循環(huán)(event loop)的下一個迭代被調用執(zhí)行。
setTimeout()以0ms的延時執(zhí)行函數(shù)參數(shù),和setImmediate()類似,但是這兩個誰先執(zhí)行,取決于多種因素,但是這兩個都是在事件循環(huán)的下一個迭代被調用執(zhí)行。
用法如:
setImmediate(function () { console.log("setImmediate..."); });
process.nextTick()
摘抄自網(wǎng)絡文章~
傳給process.nextTick()的函數(shù)參數(shù),是在事件循環(huán)的本次迭代最末尾執(zhí)行,當前迭代的其他操作結束立刻執(zhí)行該函數(shù)參數(shù)。這意味著process.nextTick()執(zhí)行總是早于setImmediate()和setTimeout().
這幾個計時器的執(zhí)行順序我們親自實驗一下:
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 的時候),最后是其他阻塞的命令;
這樣就很清晰了吧~
計時器的一些特點(坑點);
1. setInterval 是異步方法,當 callback 函數(shù)發(fā)生阻塞,間隔計時器并不會被阻塞;
2. 由于 setInterval 是異步方法,間隔計時器并不會被 callback 函數(shù)阻塞,因此當 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中的計時器使用案例解析的詳細內(nèi)容,更多關于Nodejs計時器的資料請關注腳本之家其它相關文章!
相關文章
在Node.js中將SVG圖像轉換為PNG,JPEG,TIFF,WEBP和HEIF格式的方法
這篇文章主要介紹了在Node.js中將SVG圖像轉換為PNG,JPEG,TIFF,WEBP和HEIF格式的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08