面试题答案
一键面试同步读取方式选择时机
- 场景:当应用程序需要按顺序依次读取文件,并且后续操作强烈依赖前序文件读取的结果,且读取操作相对较少,不会导致主线程长时间阻塞,影响用户体验时,可选择同步读取。例如在一个简单的配置文件加载场景中,应用程序启动时需要读取配置文件来初始化一些全局变量,且只有读取完配置文件才能继续后续操作。
- 代码示例:
const fs = require('fs');
try {
const config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
// 使用配置初始化全局变量等操作
console.log('应用程序基于配置初始化完成', config);
} catch (err) {
console.error('读取配置文件错误', err);
}
异步读取方式选择时机
- 场景:在包含大量文件读取操作的复杂场景中,尤其是当部分读取操作依赖其他读取结果,但希望主线程不被阻塞,能继续处理其他任务(如响应网络请求等),提高应用程序的整体性能和响应性时,应选择异步读取。例如在一个文件索引构建的任务中,需要读取大量文件内容来提取元数据并建立索引,同时应用程序还需要处理用户的查询请求。
- 代码示例:
const fs = require('fs');
const path = require('path');
const util = require('util');
const readFileAsync = util.promisify(fs.readFile);
async function buildIndex() {
try {
const filePaths = ['file1.txt', 'file2.txt', 'file3.txt'];
const readPromises = filePaths.map(async filePath => {
const content = await readFileAsync(path.join(__dirname, filePath), 'utf8');
// 处理文件内容,提取元数据等操作
const metadata = { filePath, contentLength: content.length };
return metadata;
});
const allMetadata = await Promise.all(readPromises);
console.log('文件索引构建完成', allMetadata);
} catch (err) {
console.error('读取文件或构建索引错误', err);
}
}
buildIndex();
总结
在进行文件读取操作方式选择时,要综合考虑文件读取数量、读取操作间的依赖关系以及应用程序对主线程阻塞的容忍度等因素。同步读取适合简单且对顺序要求严格、操作量小的场景;异步读取则适用于复杂、操作量大且需要保持主线程非阻塞的场景,以实现最佳性能和稳定性。