Nodejs中的计时器(setTimeout setIntervals etImmediate)使用案例解析
作者:狄仁杰666
前言
今天我们先来学习两个小知识点,他们就是:
- 超时计时器:setTimeout
- 间隔计时器:setInterval
- 即时计时器:setImmediate
- process.nextTick()
学习路径
- 超时计时器 setTimeout 的使用;
- 取消超时计时器;
- 间隔计时器 setInterval 的使用;
- 取消间隔计时器;
- 即时计时器:setImmediate
- process.nextTick()
- 计时器的一些特点(坑点);
超时计时器 setTimeout 的使用;
超时计时器 setTimeout,作用是在延迟多久后执行我们的代码,是一次性的事件;
setTimeout 方法的接口规范;
setTimeout(callback,delayMillSeconds,[args]) // callback 为回调函数
setTimeout 方法的使用案例;
setTimeout( (text) => { console.log(text); }, 500, "超时计时器 2 触发并停止" );
或:
function timeoutExample(text: string) { console.log(text); } setTimeout(timeoutExample, 500, "超时计时器 1 触发并停止");
超时计时器
取消超时计时器;
当我们设置了一个时长比较长的超时计时器,如何中途取消呢?例子如下:
void (async () => { console.log(new Date()); console.log("超时计时器 3 开始倒计时"); const timer = setTimeout( (text) => { console.log(text); }, 30e3, "超时计时器 3 触发" ); await sleep(2e3); console.log(new Date()); console.log("取消超时计时器 3"); clearTimeout(timer); console.log("超时计时器 3 停止"); })();
取消超时计时器
我们会看到,按我们的设计,2 秒钟之后就将超时计时器停掉了,而不是等到 setTimeout 初始设置的 30 秒~
间隔计时器 setInterval 的使用;
间隔计时器 setInterval,作用是在每延迟多久后执行我们的代码,是重复性、循环性的事件;
setInterval 方法的接口规范;
setInterval(callback,delayMilliSecond,[args]) // callback 为回调函数
setTimeout 方法的使用案例;
(本例为:每隔 1 秒钟执行一次指令)
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
摘抄自网络文章~
当你想在 Nodejs 中执行异步代码,并且想尽可能快的执行,那么可以选择 Nodejs 中的 setImmediate() 函数。
任何传给setImmediate()的函数参数,都是在事件循环(event loop)的下一个迭代被调用执行。
setTimeout()以0ms的延时执行函数参数,和setImmediate()类似,但是这两个谁先执行,取决于多种因素,但是这两个都是在事件循环的下一个迭代被调用执行。
用法如:
setImmediate(function () { console.log("setImmediate..."); });
process.nextTick()
摘抄自网络文章~
传给process.nextTick()的函数参数,是在事件循环的本次迭代最末尾执行,当前迭代的其他操作结束立刻执行该函数参数。这意味着process.nextTick()执行总是早于setImmediate()和setTimeout().
这几个计时器的执行顺序我们亲自实验一下:
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);
几个计时器的执行顺序
我们会看到其他非阻塞的命令会先执行,然后是 process.nextTick(),接着是 setImmediate,然后是 setTimeout(此处演示延迟为 0 的时候),最后是其他阻塞的命令;
这样就很清晰了吧~
计时器的一些特点(坑点);
1. setInterval 是异步方法,当 callback 函数发生阻塞,间隔计时器并不会被阻塞;
2. 由于 setInterval 是异步方法,间隔计时器并不会被 callback 函数阻塞,因此当 callback 函数发生报错,间隔计时器并不会抛错而停止,例如:
setInterval( async function (text: string) { console.log(text); await sleep(3e3); throw new Error("This is an error!"); }, 1e3, "Hello~" );
异步、不抛错
可以看到指令一直在执行,并不会因抛错而停止~
这样的异步和不抛错,在某些场景下可能还是会诧异,记录一下~
setTimeout 和 setInterval 执行时间是不精确的。
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");
执行时间不精确
其他待后续记录~
以上就是Nodejs中的计时器使用案例解析的详细内容,更多关于Nodejs计时器的资料请关注脚本之家其它相关文章!