面试题答案
一键面试设计思路
- 队列机制:使用一个队列来存储所有待写入的数据。这样可以保证数据按照接收的顺序排列。
- 锁机制:引入一个锁变量,用于标识当前是否有写入操作正在进行。当有写入操作时,其他请求需要等待锁释放。
- 递归处理:每次从队列中取出一个数据进行写入,写入完成后检查队列是否还有数据,如果有则继续写入,直到队列为空。
核心代码实现
const fs = require('fs');
const path = require('path');
const util = require('util');
// 异步写入文件的函数
const writeFileAsync = util.promisify(fs.writeFile);
// 待写入的文件路径
const filePath = path.join(__dirname, 'output.txt');
// 数据队列
const writeQueue = [];
// 锁变量
let isWriting = false;
// 添加数据到队列并触发写入
function enqueueWrite(data) {
writeQueue.push(data);
if (!isWriting) {
processQueue();
}
}
async function processQueue() {
isWriting = true;
while (writeQueue.length > 0) {
const data = writeQueue.shift();
try {
await writeFileAsync(filePath, data + '\n', { flag: 'a' });
console.log('Data written successfully:', data);
} catch (err) {
console.error('Error writing data:', err);
}
}
isWriting = false;
}
// 示例使用
enqueueWrite('First line');
enqueueWrite('Second line');
enqueueWrite('Third line');
上述代码实现了以下功能:
enqueueWrite
函数将数据添加到队列,并在队列首次有数据且当前没有写入操作时,触发队列处理。processQueue
函数负责从队列中取出数据并异步写入文件,每次写入完成后检查队列是否还有数据,继续处理直到队列为空。- 使用
util.promisify
将fs.writeFile
转换为Promise形式,便于使用await
实现异步操作的顺序执行。