面试官 🤔:Node.js 中的异步 I/O......

160 阅读2分钟

Screen Recording 2024-07-13 at 00.05.37.gif

在 Node.js 中,异步 I/O 是非常重要的概念,它允许 Node.js 在执行 I/O 操作时不阻塞整个进程,而是利用回调函数或者 Promise 对象来处理异步操作的结果。这种非阻塞的特性使得 Node.js 能够处理大量并发请求,提高了应用程序的性能和响应速度。

异步 I/O 的实现主要依赖于事件循环(Event Loop)机制,Node.js 在执行程序时会将 I/O 操作交给操作系统处理,同时继续执行后续的代码。当操作系统完成 I/O 操作后,Node.js 会通过回调函数或者 Promise 的方式将结果返回,从而实现异步操作。

例如,在 Node.js 中进行文件读取操作可以使用以下方式来实现异步 I/O:

const fs = require('fs');

// 异步读取文件
fs.readFile('example.txt', 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});

console.log('读取文件操作进行中...'); // 这行代码会先执行

在这个例子中,fs.readFile 函数是异步的,它会立即返回并继续执行后续代码,不会等待文件读取完成。文件读取完成后,通过回调函数输出文件内容。

或者,使用 http 模块进行异步 HTTP 请求:

const http = require('http');

// 发送 HTTP GET 请求
http.get('http://example.com', (res) => {
    let data = '';

    // 接收数据块
    res.on('data', (chunk) => {
        data += chunk;
    });

    // 响应结束
    res.on('end', () => {
        console.log('Response:', data);
    });

}).on('error', (err) => {
    console.log('Error:', err.message);
});

还有,使用 mysql 模块进行异步数据库操作:

const mysql = require('mysql');

// 创建数据库连接
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'test'
});

// 连接到数据库
connection.connect();

// 异步查询数据库
connection.query('SELECT * FROM users', (error, results, fields) => {
    if (error) throw error;
    console.log('Users:', results);
});

// 关闭连接
connection.end();

异步 I/O 的优势在于可以充分利用单线程的特点,处理多个并发请求而不会阻塞程序执行,这使得 Node.js 在高并发场景下表现出色。