美文网首页
Nodejs 中的计时器

Nodejs 中的计时器

作者: 狄仁杰666 | 来源:发表于2023-05-09 16:37 被阅读0次

前言

来啦老铁!

好久不见,已经一个月没有输出文章了,并不是笔者躺平(放弃挣扎),而是这期间有太多事情了,没忙过来,新文章草稿了一堆,还没有来得及梳理发出,后续我预计会输出几篇文章,敬请期待~

今天我们先来学习两个小知识点,他们就是:

  • 超时计时器:setTimeout
  • 间隔计时器:setInterval
  • 即时计时器:setImmediate
  • process.nextTick()

学习路径

  1. 超时计时器 setTimeout 的使用;
  2. 取消超时计时器;
  3. 间隔计时器 setInterval 的使用;
  4. 取消间隔计时器;
  5. 即时计时器:setImmediate
  6. process.nextTick()
  7. 计时器的一些特点(坑点);

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 触发并停止");
超时计时器

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 停止");
})();
取消超时计时器

我们会看到,按我们的设计,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);
几个计时器的执行顺序

我们会看到其他非阻塞的命令会先执行,然后是 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~"
);
异步、不抛错

可以看到指令一直在执行,并不会因抛错而停止~

这样的异步和不抛错,在某些场景下可能还是会诧异,记录一下~

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");
执行时间不精确

其他待后续记录~

小小计时器也蕴含我之前不知道的知识点,真是没想到啊~

能力有限,欢迎指正、互相交流,感谢~

如果本文对您有帮助,麻烦动动手指点点赞?

谢谢!

相关文章

网友评论

      本文标题:Nodejs 中的计时器

      本文链接:https://www.haomeiwen.com/subject/cdnrsdtx.html