NodeJS之timer模块

2019/8/27 NodeJS

🌙 NodeJS之timer模块学习笔记

🌙 1.timer(定时器)简介

timer 模块开放了一个全局的 API,用于安排函数在未来某个时间点被调用。 因为定时器函数是全局的,所以使用 API 不需要调用 require('timers')

Node.js 中的定时器函数实现了与 Web 浏览器提供的定时器 API 类似的 API,但是使用了不同的内部实现(构建于 Node.js 事件循环 (opens new window))。

🌙 2.设置定时器

[由setTimeout和setImmediate执行顺序的随机性窥探Node的事件循环机制 (opens new window)](https://segmentfault.com/a/1190000013102056)

🌙 2.1 setImmediate(callback[, ...args])事件轮询的末尾处执行

安排在 I/O 事件的回调之后立即执行的 callback

当多次调用 setImmediate() 时, callback 函数会按它们被创建的顺序放入排队等待执行。 每轮的事件循环迭代都会处理整个回调队列。 如果一个 immediate 定时器是从一个正在执行中的回调内部被放入队列,则该定时器将不会被触发,直到下一轮的事件循环迭代。

console.log('before immediate');

setImmediate((arg) => {
    console.log(`executing immediate: ${arg}`);
}, 'so immediate');

console.log('after immediate');

// 输出结果
// before immediate
// after immediate
// executing immediate: so immediate
1
2
3
4
5
6
7
8
9
10
11
12

此方法有一个定制的用于 promise 的变体,使用 util.promisify() (opens new window) 创建:

const util = require('util');
const setImmediatePromise = util.promisify(setImmediate);

setImmediatePromise('foobar').then((value) => {
  // value === 'foobar' (传值是可选的)
  // 这会在所有的 I/O 回调之后执行。
});

// 或使用异步函数。
async function timerExample() {
  console.log('在 I/O 回调之前');
  await setImmediatePromise();
  console.log('在 I/O 回调之后');
}
timerExample();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

🌙 2.2 setInterval(callback, delay[, ...args])永远的轮询执行

安排每隔 delay 毫秒重复执行 callback

delay 大于 2147483647 或小于 1 时,则 delay 将会被设置为 1。 非整数的 delay 会被截断为整数。

🌙 2.3 setTimeout(callback, delay[, ...args])指定时间之后执行

安排在 delay 毫秒之后执行一次性的 callback

callback 可能不会精确地在 delay 毫秒后被调用 。 Node.js 不保证回调被触发的确切时间,也不保证它们的顺序。 回调会在尽可能接近指定的时间被调用。

delay 大于 2147483647 或小于 1 时,则 delay 将会被设置为 1。 非整数的 delay 会被截断为整数。

如果 callback 不是函数,则抛出 TypeError (opens new window)

此方法有一个定制的用于 promise 的变体,使用 util.promisify() (opens new window) 创建:

const util = require('util');
const setTimeoutPromise = util.promisify(setTimeout);

setTimeoutPromise(40, 'foobar').then((value) = {
  // value === 'foobar' (传值是可选的)
  // 这会在大约 40 毫秒后执行。
});
1
2
3
4
5
6
7

🌙 3.取消定时器

setImmediate() (opens new window)setInterval() (opens new window)setTimeout() (opens new window) 方法会各自返回表示安排的定时器的对象。 它们可用于取消定时器并阻止其触发。

使用 setImmediate() (opens new window)setTimeout() (opens new window) 的 promise 化的变体创建的定时器则无法取消。

🌙 3.1clearImmediate(immediate)

取消由 setImmediate() (opens new window) 创建的 Immediate 对象。

🌙 3.2clearInterval(timeout)

取消由 setInterval() (opens new window) 创建的 Timeout 对象。

🌙 3.3clearTimeout(timeout)

取消由 setTimeout() (opens new window) 创建的 Timeout 对象。