面试题答案
一键面试资源管理原则
- 使用
try - catch - finally
块:在try
块中执行资源获取和操作,catch
块捕获异常,finally
块确保无论操作成功或失败,资源都能被正确释放。 - 利用
Promise
或async/await
:Promise
的链式调用和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();
在上述代码中:
getDatabaseConnection
模拟获取数据库连接。queryDatabase
模拟在连接上执行查询操作。releaseDatabaseConnection
模拟释放数据库连接。- 在
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
链式调用的示例中,无论在获取连接、查询或者后续处理过程中出现错误,都能确保数据库连接被释放,从而避免资源泄漏。