You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:05:11