Node.js 事件循环学习笔记
1. 什么是事件循环?
事件循环是Node.js中非常重要的机制之一,它使得Node.js可以实现异步I/O操作,同时不会阻塞线程。
2. 事件循环的工作原理是什么?
事件循环的工作原理可以用以下步骤来概括:
- Node.js启动时会创建一个事件循环并开始工作。
- Node.js会从事件队列中取出第一个事件并执行它。
- 如果事件被标记为需要异步处理,Node.js会将其交给libuv库来处理。
- 当libuv执行异步操作完成后,它会将事件添加到事件队列中。
- Node.js会继续从事件队列中取出下一个事件并执行它。
- 如果事件队列为空,事件循环会等待新的事件加入。
3. 事件的分类有哪些?
Node.js中的事件大致可以分为以下几类:
- I/O事件:例如网络请求、文件读写等操作。
- 定时器事件:例如setTimeout()和setInterval()函数。
- 微任务事件:例如Promise回调函数和process.nextTick()函数。
- 自定义事件:用户可以使用EventEmitter类自定义事件。
4. 给出一个事件循环的例子
javascriptCopy Codeconst fs = require('fs');
console.log('start');
fs.readFile('./file.txt', (err, data) => {
if (err) {
throw err;
}
console.log(data.toString());
});
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
process.nextTick(() => {
console.log('nextTick');
});
console.log('end');
这段代码中,我们读取了一个文件并设置了定时器、微任务和自定义事件。运行代码后,输出结果为:
Copy Codestart
end
nextTick
immediate
Hello, world!
timeout
我们可以看到,虽然文件读取操作需要一定的时间,但这并没有阻塞后续代码的执行。另外,我们也可以观察到异步I/O操作、定时器事件、微任务事件和自定义事件的不同执行顺序。