前言
来啦老铁!
好久不见,已经一个月没有输出文章了,并不是笔者躺平(放弃挣扎),而是这期间有太多事情了,没忙过来,新文章草稿了一堆,还没有来得及梳理发出,后续我预计会输出几篇文章,敬请期待~
今天我们先来学习两个小知识点,他们就是:
- 超时计时器:setTimeout
- 间隔计时器:setInterval
- 即时计时器:setImmediate
- process.nextTick()
学习路径
- 超时计时器 setTimeout 的使用;
- 取消超时计时器;
- 间隔计时器 setInterval 的使用;
- 取消间隔计时器;
- 即时计时器:setImmediate
- process.nextTick()
- 计时器的一些特点(坑点);
1. 超时计时器 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 触发并停止");
![](https://img.haomeiwen.com/i11128110/71674a586d3bfd36.png)
2. 取消超时计时器;
当我们设置了一个时长比较长的超时计时器,如何中途取消呢?例子如下:
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 停止");
})();
![](https://img.haomeiwen.com/i11128110/ca04c74c65fbc1e8.png)
我们会看到,按我们的设计,2 秒钟之后就将超时计时器停掉了,而不是等到 setTimeout 初始设置的 30 秒~
3. 间隔计时器 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~"
);
4. 取消间隔计时器;
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);
5. 即时计时器:setImmediate
摘抄自网络文章~
当你想在 Nodejs 中执行异步代码,并且想尽可能快的执行,那么可以选择 Nodejs 中的 setImmediate() 函数。
任何传给setImmediate()的函数参数,都是在事件循环(event loop)的下一个迭代被调用执行。
setTimeout()以0ms的延时执行函数参数,和setImmediate()类似,但是这两个谁先执行,取决于多种因素,但是这两个都是在事件循环的下一个迭代被调用执行。
用法如:
setImmediate(function () {
console.log("setImmediate...");
});
6. 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);
![](https://img.haomeiwen.com/i11128110/f06fbed2d124a459.png)
我们会看到其他非阻塞的命令会先执行,然后是 process.nextTick(),接着是 setImmediate,然后是 setTimeout(此处演示延迟为 0 的时候),最后是其他阻塞的命令;
这样就很清晰了吧~
7. 计时器的一些特点(坑点);
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~"
);
![](https://img.haomeiwen.com/i11128110/e58a37f51d06ef37.png)
可以看到指令一直在执行,并不会因抛错而停止~
这样的异步和不抛错,在某些场景下可能还是会诧异,记录一下~
3. 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");
![](https://img.haomeiwen.com/i11128110/889698d36726375f.png)
其他待后续记录~
小小计时器也蕴含我之前不知道的知识点,真是没想到啊~
能力有限,欢迎指正、互相交流,感谢~
如果本文对您有帮助,麻烦动动手指点点赞?
谢谢!
网友评论