面试题答案
一键面试设计思路
- 使用Promise或async/await:将文件系统的异步操作包装成Promise,这样可以使用
then
、catch
链式调用或者async/await
语法来处理异步流程和错误。async/await
语法糖使异步代码看起来更像同步代码,提高可读性。 - 错误处理:在每个异步操作的Promise链中使用
catch
捕获错误,一旦某个操作出错,就停止后续操作,并将错误传递给上层处理,确保整个流程正确结束。 - 性能优化:对于一些可以并行执行的操作,可以使用
Promise.all
来并行处理,提高整体性能。但要注意文件系统操作可能会受到系统资源限制,并行过多可能导致性能下降,需根据实际情况调整。
关键代码片段
假设我们有一个业务流程,先写入文件,再读取文件,最后删除文件。
const fs = require('fs');
const { promisify } = require('util');
const writeFile = promisify(fs.writeFile);
const readFile = promisify(fs.readFile);
const unlink = promisify(fs.unlink);
async function complexFileOperation() {
try {
// 写入文件
await writeFile('test.txt', 'Hello, World!');
console.log('文件写入成功');
// 读取文件
const data = await readFile('test.txt', 'utf8');
console.log('文件读取成功:', data);
// 删除文件
await unlink('test.txt');
console.log('文件删除成功');
} catch (error) {
// 捕获并处理错误
console.error('操作出错:', error.message);
}
}
complexFileOperation();
在上述代码中:
- 使用
promisify
将fs
模块的异步方法转化为返回Promise的方法。 async/await
语法简洁地处理了异步流程,try/catch
块捕获并处理可能出现的错误。- 如果希望部分操作并行执行,例如写入多个文件,可以使用
Promise.all
,示例如下:
async function parallelWriteFiles() {
try {
const writePromises = ['file1.txt', 'file2.txt'].map(file => writeFile(file, 'Some content'));
await Promise.all(writePromises);
console.log('所有文件写入成功');
} catch (error) {
console.error('写入文件时出错:', error.message);
}
}
parallelWriteFiles();