node.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > node.js > Nodejs计时器

Nodejs中的计时器(setTimeout setIntervals etImmediate)使用案例解析

作者:狄仁杰666

这篇文章主要介绍了Nodejs中的计时器(setTimeout setIntervals etImmediate)使用案例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

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

学习路径

超时计时器 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计时器的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文