Node.js 是一个基于 Chrome 的 V8 JavaScript 引擎构建的强大且流行的 JavaScript 运行时。
1) 事件驱动架构:
Node.js 使用事件驱动的非阻塞 I/O 模型
阻止操作:
程序执行暂停或等待,直到操作完成。在此期间,系统或线程无法执行其他任务。
阻塞操作通常是同步的,因为它们会停止执行以下代码直到完成
同步:
程序等待操作完成,然后再转到下一个任务。
前任。在 Node.js 中同步读取文件:
非阻塞操作:
程序不会等待操作完成。相反,它会继续执行其他任务,同时操作在后台继续进行。
异步:
程序可以在等待操作完成的同时执行其他任务。更复杂的是,需要处理异步结果的机制(例如回调、promise、async/await)。
事件循环
事件循环负责管理和执行异步操作的回调。
2) 异步和非阻塞:
事件循环是 Node.js 的核心组件,用于管理和协调异步操作的执行。
调用堆栈:
调用堆栈跟踪当前正在执行的函数。它是一个堆栈数据结构,其中函数在调用时添加,在完成时删除。
回调队列:
该队列保存已完成并等待执行的异步操作(如 I/O 操作、计时器或网络请求)的回调。
事件队列:
与回调队列类似,它保存事件及其关联的回调。事件是指用户交互、计时器到期或网络响应等。
微任务队列(或下一个 Tick 队列):
该队列保存微任务,这些微任务通常是 Promise 及其 .then() 回调。微任务比回调具有更高的优先级,并且在事件队列之前进行处理。
计时器:
事件循环使用 setTimeout() 和 setInterval() 管理计时器。这些计划在指定的延迟后或定期间隔执行。
I/O 操作:
事件循环处理 I/O 操作,例如文件读取、网络请求和数据库查询。它允许 Node.js 异步处理这些操作,而不会阻塞主线程。
const fs = require('fs'); // Asynchronous file read fs.readFile('file.txt', 'utf8', (err, data) => { console.log('File read complete:', data); }); // Synchronous operation console.log('This prints first'); // Timer setTimeout(() => { console.log('Timeout executed'); }, 0); console.log('This prints second');
同步代码(console.log('This prints first') 和 console.log('This prints secondary'))首先运行,因为它被添加到调用堆栈中。
fs.readFile回调和setTimeout回调被添加到各自的队列(回调队列和定时器队列)中。
同步代码执行后,事件循环处理定时器队列并执行setTimeout回调。接下来,它处理回调队列并执行 fs.readFile 回调。
const fs = require('fs'); // Asynchronous file read fs.readFile('file.txt', 'utf8', (err, data) => { console.log('File read complete:', data); }); // Synchronous operation console.log('This prints first'); // Timer setTimeout(() => { console.log('Timeout executed'); }, 0); console.log('This prints second');
回调是作为参数传递到另一个函数的函数,然后在外部函数内部调用该函数以完成某种例程或操作。
var http = require('http'); const server = http.createServer(function(req, res) { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello World\n'); }) server.listen(8080, () => { console.log('Server running at http://127.0.0.1:8080/'); });
表示异步操作最终完成(或失败)及其结果值的对象。
function downloadFile(url, callback) { console.log(`Starting to download file from ${url}`); setTimeout(() => { console.log('File downloaded successfully'); callback('File content'); }, 2000); } function processFile(content) { console.log(`Processing file with content: ${content}`); } downloadFile('http://example.com/file', processFile);
保持联系!
如果您喜欢这篇文章,请不要忘记在社交媒体上关注我以获取更多更新和见解:
推特: madhavganesan
Instagram:madhavganesan
领英: madhavganesan
以上是NodeJS 简介的详细内容。更多信息请关注PHP中文网其他相关文章!