Deno中BufWriterSync循环内调用writeSync无输出问题
解决Deno中BufWriterSync循环内无输出的问题
问题原因分析
你的代码存在两个核心问题导致无输出:
- 数组初始化错误:
new Uint32Array().fill(1, 0, 1000)创建的是长度为0的数组,fill方法不会扩展数组长度,因此forEach循环根本没有执行。 - 缓冲未刷新:
BufWriterSync是带缓冲的写入器,只有当缓冲区填满或手动调用flushSync()时,才会将缓冲数据写入目标流(这里是Deno.stdout),即使循环执行了,数据也会留在缓冲里而不会输出到控制台。
修复后的代码
import { BufWriterSync } from "https://deno.land/std@0.182.0/io/buf_writer.ts"; const BUFFER = BufWriterSync.create(Deno.stdout); const TEXT_ENCODER = new TextEncoder(); function main() { // 修正:创建长度为1000的Uint32Array,填充1(若需要0-999可改为直接遍历数字) const range = new Uint32Array(1000).fill(1); // 或者如果需要生成0到999的数字,用Array.from更直观: // const range = Array.from({length: 1000}, (_, i) => i); range.forEach(number => { BUFFER.writeSync(TEXT_ENCODER.encode(`${number.toString()} `)); // 加空格区分数字和描述 if (!isEven(number)) { BUFFER.writeSync(TEXT_ENCODER.encode(`${number} is odd\n`)); // 加换行让输出更清晰 } else { BUFFER.writeSync(TEXT_ENCODER.encode(`${number} is even\n`)); } }); // 关键:手动刷新缓冲区,将数据写入控制台 BUFFER.flushSync(); console.log(BUFFER.buffered()); // 现在应该输出0,因为数据已被刷出 } Deno.bench("benchmark", function () { main(); }); function isEven(num: number): boolean { return num % 2 === 0; } if (import.meta.main) { main(); }
额外说明
- 如果需要频繁输出(比如调试场景),可以在循环内部适当调用
flushSync(),但频繁刷新会降低缓冲带来的性能优势,需根据需求权衡。 - 若要生成连续数字序列,使用
Array.from({length: N}, (_, i) => i)比Uint32Array填充更直观,除非你需要严格的无符号32位整数类型。
内容的提问来源于stack exchange,提问作者Cherry
相关产品推荐
相关产品推荐

