MST

星途 面试题库

面试题:JavaScript 并发处理函数属性下的资源分配与释放

在 JavaScript 里,当处理函数属性并发操作时,可能涉及到外部资源的获取与释放,比如数据库连接或者文件句柄等。请阐述如何优雅地管理这些资源,确保在并发场景下既不会出现资源泄漏,又能高效地利用资源。可以结合 Promise 或者 async/await 来描述,并给出一个实际应用场景下的代码示例。
23.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

资源管理原则

  1. 使用 try - catch - finally:在 try 块中执行资源获取和操作,catch 块捕获异常,finally 块确保无论操作成功或失败,资源都能被正确释放。
  2. 利用 Promiseasync/awaitPromise 的链式调用和 async/await 的语法糖可以使异步操作更加清晰,便于资源管理。

结合 async/await 的实际应用场景

假设我们有一个需要获取数据库连接,执行查询,然后释放连接的场景。

// 模拟数据库连接获取函数
function getDatabaseConnection() {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('数据库连接获取成功');
            resolve({ /* 模拟连接对象 */ });
        }, 1000);
    });
}

// 模拟查询操作
function queryDatabase(connection, sql) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(`在连接上执行查询: ${sql}`);
            resolve(`查询结果: ${sql}`);
        }, 1000);
    });
}

// 模拟释放数据库连接函数
function releaseDatabaseConnection(connection) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('数据库连接释放成功');
            resolve();
        }, 1000);
    });
}

async function main() {
    let connection;
    try {
        // 获取数据库连接
        connection = await getDatabaseConnection();
        // 执行查询
        const result = await queryDatabase(connection, 'SELECT * FROM users');
        console.log(result);
    } catch (error) {
        console.error('操作过程中出现错误:', error);
    } finally {
        if (connection) {
            // 释放数据库连接
            await releaseDatabaseConnection(connection);
        }
    }
}

main();

在上述代码中:

  1. getDatabaseConnection 模拟获取数据库连接。
  2. queryDatabase 模拟在连接上执行查询操作。
  3. releaseDatabaseConnection 模拟释放数据库连接。
  4. main 函数中,通过 async/await 结合 try - catch - finally 块,确保无论查询是否成功,数据库连接都能被正确释放,避免资源泄漏。

结合 Promise 的实际应用场景

同样以上述数据库操作场景为例,使用 Promise 链式调用实现:

// 模拟数据库连接获取函数
function getDatabaseConnection() {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('数据库连接获取成功');
            resolve({ /* 模拟连接对象 */ });
        }, 1000);
    });
}

// 模拟查询操作
function queryDatabase(connection, sql) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(`在连接上执行查询: ${sql}`);
            resolve(`查询结果: ${sql}`);
        }, 1000);
    });
}

// 模拟释放数据库连接函数
function releaseDatabaseConnection(connection) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('数据库连接释放成功');
            resolve();
        }, 1000);
    });
}

getDatabaseConnection()
   .then((connection) => {
        return queryDatabase(connection, 'SELECT * FROM users')
           .then((result) => {
                console.log(result);
                return releaseDatabaseConnection(connection);
            })
           .catch((error) => {
                console.error('查询操作出现错误:', error);
                return releaseDatabaseConnection(connection);
            });
    })
   .catch((error) => {
        console.error('获取连接出现错误:', error);
    });

在这个 Promise 链式调用的示例中,无论在获取连接、查询或者后续处理过程中出现错误,都能确保数据库连接被释放,从而避免资源泄漏。