面试题答案
一键面试- 检测背压:
- 在 Node.js 中,当使用
Writable
流写入数据时,write()
方法返回false
表示出现背压。即写入缓冲区已满,可写流暂时无法处理更多数据。
- 在 Node.js 中,当使用
- 处理背压:
- 当
write()
方法返回false
时,需要暂停写入数据,直到可写流的drain
事件触发。drain
事件表示可写流的缓冲区已经处理了足够的数据,有空间接受更多数据,此时可以继续写入。
- 当
- 代码示例:
const fs = require('fs');
// 创建一个可写流,写入到文件 output.txt
const writeStream = fs.createWriteStream('output.txt');
// 要写入的数据
const data = 'a'.repeat(1024 * 1024); // 1MB 的数据
let i = 0;
const writeChunk = () => {
let writeResult = true;
do {
const chunk = data.slice(i, i + 1024);
writeResult = writeStream.write(chunk);
i += 1024;
} while (i < data.length && writeResult);
if (!writeResult) {
// 当 write() 返回 false,说明出现背压,暂停写入
writeStream.once('drain', () => {
writeChunk();
});
} else if (i === data.length) {
// 所有数据写入完成
writeStream.end();
}
};
writeChunk();
上述代码中:
- 首先创建了一个写入文件的可写流
writeStream
。 - 定义了一个大字符串
data
用于模拟大量要写入的数据。 writeChunk
函数负责每次写入 1KB 数据块。当write()
方法返回false
时,暂停写入并监听drain
事件,当drain
事件触发时,继续调用writeChunk
函数写入数据,直到所有数据写入完成。最后调用writeStream.end()
结束写入操作。