1、参考:Node.js 事件循环 | 菜鸟教程
2、实践截图
2.1、事件循环的流程
setTimeout(() => {
console.log('Timeout callback');
}, 0);
setImmediate(() => {
console.log('Immediate callback');
});
console.log('Main thread execution');
输出顺序:
Main thread execution
先打印。setImmediate()
和setTimeout()
的执行顺序取决于当前事件循环的状态,一般setImmediate()
会先执行。
不过,实际和预期不符
2.2、宏任务与微任务
setTimeout(() => {
console.log('Timeout callback');
}, 0);
Promise.resolve().then(() => {
console.log('Promise callback');
});
console.log('Main thread execution');
2.3、process.nextTick()
process.nextTick(() => {
console.log('Next tick callback');
});
console.log('Main thread execution');
2.4、事件驱动程序
例1、
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// 注册事件处理器
myEmitter.on('greet', () => {
console.log('Hello, world!');
});
// 触发事件
myEmitter.emit('greet');
例2、
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received');
}
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('数据接收成功。');
});
// 触发 connection 事件
eventEmitter.emit('connection');
console.log("程序执行完毕。");