🌙 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])事件轮询的末尾处执行
callbackFunction (opens new window) Node.js 事件循环 (opens new window)的此回合结束时要调用的函数。...argsany (opens new window) 当调用callback时传入的可选的参数。- 返回: Immediate (opens new window) 用于
clearImmediate()(opens new window)。
安排在 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
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();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
🌙 2.2 setInterval(callback, delay[, ...args])永远的轮询执行
callbackfunction (opens new window) 当定时器到点时调用的函数。delaynumber (opens new window) 调用callback之前等待的毫秒数。...argsany (opens new window) 当调用callback时传入的可选参数。- 返回: Timeout (opens new window) 用于
clearInterval()(opens new window)。
安排每隔 delay 毫秒重复执行 callback。
当 delay 大于 2147483647 或小于 1 时,则 delay 将会被设置为 1。 非整数的 delay 会被截断为整数。
🌙 2.3 setTimeout(callback, delay[, ...args])指定时间之后执行
callbackfunction (opens new window) 当定时器到点时调用的函数。delaynumber (opens new window) 调用callback之前等待的毫秒数。...argsany (opens new window) 当调用callback时传入的可选参数。- 返回: Timeout (opens new window) 用于
clearInterval()(opens new window)。
安排在 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 毫秒后执行。
});
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)
immediateImmediate (opens new window)setImmediate()(opens new window) 返回的Immediate对象。
取消由 setImmediate() (opens new window) 创建的 Immediate 对象。
🌙 3.2clearInterval(timeout)
timeoutTimeout (opens new window)setInterval()(opens new window) 返回的Timeout对象。
取消由 setInterval() (opens new window) 创建的 Timeout 对象。
🌙 3.3clearTimeout(timeout)
timeoutTimeout (opens new window)setTimeout()(opens new window) 返回的Timeout对象。
取消由 setTimeout() (opens new window) 创建的 Timeout 对象。