一、设置定时器
1. 一次性定时器
setTimeout(函数,间隔的时间):间隔一定时间后,只执行一次,之后不再执行。
// 基本用法 setTimeout(callback, delay[, ...args]) // 示例 setTimeout(function(){ console.log('我是一个一次性的定时器'); },1000);
2.周期性定时器
setInterval(函数,间隔的时间):每间隔一定时间执行一次,循环执行。
// 基本用法 setInterval(callback, delay[, ...args]) // 示例 setInterval (function(){ console.log('我是一个周期性的定时器'); },1000);
3.即时定时器
即时定时器:setImmediate():只要启动,马上执行。
// 基本用法 setImmediate(callback[, ...args])
二、取消定时器
分别用clearTimeout()、clearInterval()和clearImmediate()方法取消相应定时器,防止该定时器触发。
var testInterval=setInterval(testFunc,2000); ... clearInterval(testInterval);
三、Timeout和Immediate类
- Node.js内置两个有关定时器的类Timeout和Immediate,可用于创建相应的对象。
- Timeout对象在内部创建,并由setTimeout()或setInterval()方法返回,可以传递给clearTimeout()或clearInterval()以取消定时器。
- Immediate对象也在内部创建,并由setImmediate()方法返回。它可以传递给clearImmediate()以取消即时定时器。
四、setImmediate()方法与setTimeout()方法的对比
程序代码 执行结果 在一个I/O周期(即主模块)内调用的比较 setTimeout(() => {
console.log('一次性');
}, 0);
setImmediate(() => {
console.log('即时性');
});
C:\nodeapp\ch02>node timeout_vs_immediate1.js
一次性
即时性
C:\nodeapp\ch02>node timeout_vs_immediate1.js
即时性
一次性
同一个I/O循环内调用的比较 const fs = require('fs'); fs.readFile(__filename, () => {
setTimeout(() => {
console.log('一次性');
}, 0);
setImmediate(() => {
console.log('即时性');
});
});
C:\nodeapp\ch02>node timeout_vs_immediate2.js
即时性
一次性
C:\nodeapp\ch02>node timeout_vs_immediate2.js
即时性
一次性
五、 process.nextTick()与setImmediate()的对比
- process.nextTick()在当前阶段立即执行。
- setImmediate()在下一次迭代或事件循环的tick事件上被触发。
- process.nextTick()的回调函数执行的优先级要高于setImmediate()。
程序代码 执行结果 console.log('开始');
process.nextTick(() => {
console.log('下一个时间点的回调');
});
console.log('调度');
开始、调度、下一个时间点的回调