¥
立即购买

代码注释生成专家

8 浏览
1 试用
0 购买
Dec 8, 2025更新

本提示词专为JavaScript开发场景设计,能够根据提供的代码片段自动生成精准、规范的注释说明。通过分析代码结构、功能逻辑和使用场景,生成符合技术文档标准的注释内容,帮助开发者快速理解代码意图、提升代码可维护性。支持多种注释风格选择,适应不同开发团队的需求规范,确保生成的注释既专业又实用。

代码概述

该代码片段提供了常用的实用函数集合,包括:

  • 解析 URL 查询字符串为对象(支持重复键合并为数组)
  • 创建函数的防抖包装(支持前沿/后沿触发选项)
  • 使用 Intl.NumberFormat 进行本地化货币格式化
  • 安全解析 JSON 字符串并在失败时返回回退值

核心注释

/**
 * 解码查询参数片段:先将加号(+)转换为空格,再进行 URL 解码。
 * 适用于 application/x-www-form-urlencoded 编码的查询字符串。
 *
 * @private
 * @param {string} str - 被编码的查询参数片段。
 * @returns {string} 解码后的字符串。
 */
const qsDecode = str => decodeURIComponent(str.replace(/\+/g, ' '));

/**
 * 将 URL 查询字符串解析为键值映射对象。
 *
 * 规则与行为:
 * - 可接受带或不带前导 '?' 的字符串。
 * - 使用 decodeURIComponent 解码键和值,并将 '+' 视为空格。
 * - 重复出现的键会被合并为数组,保持出现顺序。
 * - 空参数对会被跳过(例如末尾的 '&')。
 * - 缺失值(如 "k=")解析为值为空字符串 ""。
 * - 缺失键(如 "=v")解析为键为空字符串 ""。
 * - 对于非法的百分号编码,解码可能抛出异常。
 *
 * @param {string} [queryString=''] - 待解析的查询字符串(可包含前导 '?')。
 * @returns {{[key: string]: string | string[]}} 解析结果对象;重复键对应数组,否则为字符串。
 */
export function parseQuery(queryString = '') {
  if (!queryString) return {};
  const q = queryString.startsWith('?') ? queryString.slice(1) : queryString;
  return q.split('&').reduce((acc, pair) => {
    if (!pair) return acc;
    const [k, v = ''] = pair.split('=');
    const key = qsDecode(k || '');
    const val = qsDecode(v);
    if (acc[key] === undefined) acc[key] = val;
    else if (Array.isArray(acc[key])) acc[key].push(val);
    else acc[key] = [acc[key], val];
    return acc;
  }, {});
}

/**
 * 创建一个防抖函数:在最后一次调用后等待指定时间再执行原函数。
 *
 * 选项说明:
 * - leading:为 true 时在等待间隔开始时立即调用一次。
 * - trailing:为 true 时在等待间隔结束时调用一次。
 *   当 { leading: true, trailing: false } 时,仅在前沿调用。
 *
 * 行为特性:
 * - 连续多次调用会重置计时器,仅保留最后一次调用的参数与 this。
 * - 保留调用上下文(this)和最新参数。
 * - 不提供 cancel 或 flush 方法。
 *
 * @template {(...args: any[]) => any} F
 * @param {F} fn - 需要防抖的函数。
 * @param {number} [wait=200] - 延迟执行的毫秒数。
 * @param {{ leading?: boolean, trailing?: boolean }} [options={}] - 控制前沿/后沿触发。
 * @returns {(...args: Parameters<F>) => void} 防抖后的函数。
 */
export function debounce(fn, wait = 200, options = {}) {
  let timer, lastArgs, lastThis;
  const { leading = false, trailing = true } = options;
  return function debounced(...args) {
    lastArgs = args;
    lastThis = this;
    const invoke = () => {
      timer = undefined;
      if (trailing) fn.apply(lastThis, lastArgs);
    };
    const callNow = leading && !timer;
    clearTimeout(timer);
    timer = setTimeout(invoke, wait);
    if (callNow) fn.apply(lastThis, lastArgs);
  };
}

/**
 * 使用 Intl.NumberFormat 将数值格式化为本地化货币字符串。
 * 若 amount 非有效数字,则返回字符串 'NaN'。
 *
 * @param {number} amount - 要格式化的金额数值。
 * @param {{ locale?: string, currency?: string, minimumFractionDigits?: number }} [options] - 格式化选项。
 * @param {string} [options.locale='zh-CN'] - 语言与区域标识。
 * @param {string} [options.currency='CNY'] - 货币代码(ISO 4217)。
 * @param {number} [options.minimumFractionDigits=2] - 最少小数位数。
 * @returns {string} 被格式化的货币字符串,或 'NaN'。
 */
export function formatCurrency(
  amount,
  { locale = 'zh-CN', currency = 'CNY', minimumFractionDigits = 2 } = {}
) {
  if (typeof amount !== 'number' || Number.isNaN(amount)) return 'NaN';
  return new Intl.NumberFormat(locale, {
    style: 'currency',
    currency,
    minimumFractionDigits
  }).format(amount);
}

/**
 * 安全解析 JSON 字符串;若解析失败,返回回退值或回退函数的返回值。
 *
 * @param {string} text - JSON 文本。
 * @param {any | ((error: unknown) => any)} [fallback=null] - 解析失败时返回的值,或用于生成回退值的函数(接收错误对象)。
 * @returns {any} 解析成功返回解析结果;失败返回回退值或回退函数的返回值。
 */
export function safeJSONParse(text, fallback = null) {
  try {
    return JSON.parse(text);
  } catch (e) {
    return typeof fallback === 'function' ? fallback(e) : fallback;
  }
}

技术要点

  • 查询参数解码
    • 先替换 '+' 为空格,再用 decodeURIComponent 解码,适配表单型 URL 编码。
    • 重复键合并为数组,首次为字符串,第二次起转换为数组并追加,保持顺序。
    • 跳过空片段;缺失值解析为 "";缺失键解析为 ""。
    • 遇到非法百分号编码时 decodeURIComponent 会抛错,未在 parseQuery 内部捕获。
  • 防抖实现
    • 使用闭包保存最新的参数与 this,并在每次调用时重置 setTimeout。
    • 支持前沿(leading)与后沿(trailing)触发,默认仅后沿触发。
    • 不提供取消/立即执行 API,适合简单场景。
  • 货币格式化
    • 基于 Intl.NumberFormat,受运行环境对国际化的支持影响。
    • 对无效数值返回字符串 'NaN',避免抛错。
  • 安全 JSON 解析
    • 捕获 JSON.parse 异常;支持静态回退值或基于错误动态生成回退值的函数。

使用示例

  • parseQuery

    • 输入:"?a=1&b=2&b=3+4"
    • 输出:{ a: "1", b: ["2", "3 4"] }
  • debounce

    • 用法: const onResize = debounce(() => console.log('resize'), 300, { leading: false, trailing: true }); window.addEventListener('resize', onResize);
  • formatCurrency

    • formatCurrency(1234.5, { locale: 'en-US', currency: 'USD' }) // "$1,234.50"
  • safeJSONParse

    • safeJSONParse('{"a":1}') // { a: 1 }
    • safeJSONParse('invalid', () => ({ a: 0 })) // { a: 0 }

代码概述

该代码实现了一个带内存缓存、超时控制与指数退避重试的 fetch 封装函数 fetchWithRetry。其特性包括:

  • 请求超时通过 AbortController 实现
  • 对临时性错误(如 408/429/5xx)进行指数退避 + 抖动的重试
  • 成功响应可按 TTL 进行内存缓存(按 method + url + body 作为键)
  • 自动根据 Content-Type 解析 JSON 或文本
  • 非成功响应(非可重试)会抛出包含 status 与响应文本的错误对象

核心注释

// 基于内存的简单缓存:key 为请求签名,value 为 { expireAt: 过期时间戳(ms), data: 解析后的响应数据 }
const cache = new Map();

/**
 * 生成缓存键:由 HTTP 方法、URL 与请求体组成,确保相同请求命中缓存
 * - 对字符串类型的 body 原样使用
 * - 对非字符串 body 使用 JSON.stringify;若为 falsy 值(如 0/false/null/undefined),会被当作空字符串序列化
 */
function cacheKey(url, options) {
  const { method = 'GET', body } = options || {};
  // 注意:body || '' 会将 0/false 等值归一为空串,可能导致不同 falsy 值共享同一键
  return method + ' ' + url + ' ' + (typeof body === 'string' ? body : JSON.stringify(body || ''));
}

/**
 * 带重试、超时与可选缓存的 fetch 包装器
 * @param {string} url - 请求地址
 * @param {Object} [opts={}] - 配置项
 * @param {number} [opts.retries=3] - 最大重试次数(不含初始尝试,总尝试 = retries + 1)
 * @param {number} [opts.retryDelay=300] - 初始退避延迟(毫秒),随尝试次数指数级增长
 * @param {number} [opts.timeout=8000] - 单次请求超时时间(毫秒)
 * @param {number} [opts.jitter=0.25] - 抖动比例(0~1),用于在退避延迟上增加随机扰动
 * @param {number} [opts.cacheTTL=0] - 缓存存活时间(毫秒),0 表示不缓存
 * @param {string} [opts.method='GET'] - HTTP 方法
 * @param {HeadersInit} [opts.headers] - 请求头
 * @param {BodyInit} [opts.body] - 请求体
 * @returns {Promise<any>} - 解析后的响应数据(JSON 或文本)
 * @throws {Error} - 超时、中断、不可重试的 HTTP 错误,或最终重试失败
 */
export async function fetchWithRetry(url, opts = {}) {
  const {
    retries = 3,        // 最大重试次数(指数退避适用)
    retryDelay = 300,   // 初始退避基准(ms)
    timeout = 8000,     // 单次请求超时(ms)
    jitter = 0.25,      // 抖动比例(±jitter 区间)
    cacheTTL = 0,       // 缓存时长(ms),0 表示禁用缓存
    method = 'GET',     // HTTP 方法
    headers,            // 请求头,原样传递给 fetch
    body                // 请求体,原样传递给 fetch
  } = opts;

  // 基于方法、URL、body 生成缓存键(只针对成功响应缓存)
  const key = cacheKey(url, { method, body });

  // 命中缓存且未过期则直接返回
  if (cacheTTL > 0 && cache.has(key)) {
    const { expireAt, data } = cache.get(key);
    if (Date.now() < expireAt) return data; // 缓存未过期
    cache.delete(key); // 过期即清理
  }

  let attempt = 0; // 当前尝试次数,从 0 起;总尝试次数最多为 retries + 1
  let lastErr;     // 记录最后一次错误以便最终抛出

  // 注意:实际退出由条件判断与抛错控制,while 作为尝试框架
  while (attempt <= retries) {
    // 为本次尝试创建可中止控制器,用于超时
    const ac = new AbortController();
    // 到达超时阈值则中止请求;AbortError 将被统一转换为超时错误信息
    const id = setTimeout(() => ac.abort(new Error('timeout')), timeout);

    try {
      // 发起请求;headers 与 body 透传,不做方法-体校验(允许 GET 携带 body)
      const res = await fetch(url, {
        method,
        headers,
        body,
        signal: ac.signal
      });
      clearTimeout(id); // 请求完成即清理超时定时器(无论成功与否)

      // 非 2xx/3xx 视为失败
      if (!res.ok) {
        // 对临时性错误码进行重试:408(请求超时)、429(限流) 与常见 5xx
        if ([408, 429, 500, 502, 503, 504].includes(res.status) && attempt < retries) {
          // 指数退避:base = retryDelay * 2^attempt
          const base = retryDelay * Math.pow(2, attempt);
          // 全抖动:rand ∈ [1 - jitter, 1 + jitter]
          const rand = 1 + (Math.random() * 2 - 1) * jitter;
          // 等待退避时间后重试
          await new Promise(r => setTimeout(r, base * rand));
          attempt++;
          continue; // 继续下一次尝试
        }
        // 不可重试或已达最大次数:读取响应文本用于错误信息补充
        const text = await res.text().catch(() => '');
        const error = new Error('HTTP ' + res.status + ' ' + res.statusText);
        error.status = res.status; // 附加状态码
        error.body = text;         // 附加响应体文本(便于诊断)
        throw error;
      }

      // 按内容类型解析响应体:JSON 优先,否则按文本处理
      const ct = res.headers.get('content-type') || '';
      const data = ct.includes('application/json') ? await res.json() : await res.text();

      // 成功响应可写入缓存(仅缓存解析后的数据)
      if (cacheTTL > 0) {
        cache.set(key, { expireAt: Date.now() + cacheTTL, data });
      }
      return data; // 返回解析结果
    } catch (err) {
      clearTimeout(id); // 异常时同样清理超时定时器
      // 将 AbortError 归一化为可读的超时错误信息
      lastErr = err.name === 'AbortError' ? new Error('Request timeout') : err;

      // 若已达最大重试次数,则抛出最后的错误
      if (attempt >= retries) throw lastErr;

      // 其他错误(网络错误、超时等)同样走指数退避重试
      const base = retryDelay * Math.pow(2, attempt);
      const rand = 1 + (Math.random() * 2 - 1) * jitter;
      await new Promise(r => setTimeout(r, base * rand));
      attempt++;
    }
  }

  // 理论上不应到达此处;兜底抛出最后记录的错误
  throw lastErr;
}

技术要点

  • 最大尝试次数:总尝试 = retries + 1(初始尝试 + retries 次重试),attempt 从 0 递增。
  • 重试条件:
    • HTTP 状态码为 408/429/500/502/503/504 且尚未达到最大重试次数。
    • 网络错误、超时(AbortError 被归一化为 "Request timeout")等异常。
  • 指数退避与抖动:
    • 基础延迟 base = retryDelay × 2^attempt。
    • 抖动因子 rand = 1 + U(-jitter, +jitter),实际等待 = base × rand,减少同质化重试风暴。
  • 超时控制:每次尝试使用独立 AbortController;超时触发后中止 fetch 并清理定时器。
  • 缓存策略:
    • 仅缓存成功响应的解析结果(JSON 对象或文本字符串),不缓存 Response 对象及其头部。
    • 缓存键包含 method、url 与 body,其中:
      • 字符串 body 原样参与键计算;
      • 非字符串 body 通过 JSON.stringify(body || '') 参与,故 0/false/null/undefined 等 falsy 会被视作空串的序列化,可能共享同一键。
    • cacheTTL 为毫秒级绝对过期时间(expireAt = Date.now() + cacheTTL)。
  • 响应解析:当 Content-Type 包含 application/json 时按 JSON 解析,否则按文本解析。
  • 错误信息:对于不可重试的 HTTP 响应,抛出的 Error 附带 status 与 body,便于定位问题。
  • 选项透传:headers 与 body 原样传递,不对方法与请求体的搭配进行约束处理。

使用示例

  • 基本 GET 请求,缓存 5 秒:
const data = await fetchWithRetry('https://api.example.com/users', {
  cacheTTL: 5000,   // 缓存 5s
  retries: 2,       // 最多重试 2 次(总尝试 3 次)
  timeout: 4000     // 单次超时 4s
});
// data 为 JSON 或文本,取决于响应 Content-Type
  • 带请求体的 POST,请求头与自定义退避参数:
const result = await fetchWithRetry('https://api.example.com/login', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ username: 'alice', password: 'secret' }),
  retries: 4,        // 更高的重试上限
  retryDelay: 500,   // 初始退避 500ms
  jitter: 0.3,       // 30% 抖动
  timeout: 6000      // 6s 超时
});

代码概述

该代码实现了一个基于令牌桶算法的通用限流器(RateLimiter),支持将任意同步/异步任务排队并按固定速率执行。同时提供 createLimitedFetch,用于创建带限流能力的 fetch 包装器,按配置的速率发起 HTTP 请求,并根据响应类型自动解析为 JSON 或文本。

核心注释

/**
 * @typedef {Object} RateLimiterOptions
 * @property {number} [tokensPerInterval=5] 每个时间间隔补充的令牌数
 * @property {number} [interval=1000] 令牌补充间隔(毫秒)
 * @property {number} [maxTokens=10] 令牌桶容量上限
 */

/**
 * 令牌桶限流器。
 * - 使用固定间隔补充令牌,并按令牌可用性执行排队任务。
 * - 任务为函数(可同步或返回 Promise),执行顺序为 FIFO。
 * @class
 */
class RateLimiter {
  /**
   * @param {RateLimiterOptions} [options={}] 限流配置
   */
  constructor({ tokensPerInterval = 5, interval = 1000, maxTokens = 10 } = {}) {
    /** @type {number} 桶容量上限 */
    this.capacity = maxTokens;
    /** @type {number} 当前可用令牌数 */
    this.tokens = maxTokens;
    /** @type {number} 每个间隔补充的令牌数 */
    this.refillRate = tokensPerInterval;
    /** @type {number} 补充间隔(毫秒) */
    this.interval = interval;
    /** @type {Array<Function>} 等待执行的任务队列(FIFO) */
    this.queue = [];
    this._startRefill();
  }

  /**
   * 启动周期性令牌补充与队列尝试执行。
   * @private
   */
  _startRefill() {
    this.timer = setInterval(() => {
      // 补充令牌但不超过容量上限
      this.tokens = Math.min(this.capacity, this.tokens + this.refillRate);
      // 每次补充后尝试执行排队任务
      this._drain();
    }, this.interval);
  }

  /**
   * 停止令牌补充(释放定时器资源)。
   */
  stop() {
    clearInterval(this.timer);
  }

  /**
   * 消耗可用令牌并按序执行队列中的任务。
   * 在令牌或队列耗尽时停止。
   * @private
   */
  _drain() {
    while (this.tokens > 0 && this.queue.length) {
      const task = this.queue.shift(); // FIFO
      this.tokens--; // 执行前消耗一个令牌
      task(); // 运行任务(任务本身可能是异步)
    }
  }

  /**
   * 调度一个任务,若有令牌则立即执行,否则进入队列。
   * @template T
   * @param {() => T | Promise<T>} fn 待执行的任务函数
   * @returns {Promise<T>} 任务完成的结果
   */
  schedule(fn) {
    return new Promise((resolve, reject) => {
      const run = () => {
        // 使用微任务确保一致的异步行为,并捕获同步/异步错误
        Promise.resolve().then(fn).then(resolve).catch(reject);
      };
      if (this.tokens > 0) {
        this.tokens--; // 立即执行前消耗令牌
        run();
      } else {
        this.queue.push(run); // 无令牌时入队等待
      }
    });
  }
}

/**
 * 创建带限流能力的 fetch 包装器。
 * - 根据 content-type 自动解析 JSON 或文本。
 * - 非 2xx 响应抛出 Error('HTTP ' + status)。
 *
 * @param {RateLimiterOptions} [options] 限流配置(同 RateLimiter)
 * @returns {(url: string|URL|Request, init?: RequestInit) => Promise<any>} 受限的 fetch 函数
 * @throws {Error} 当响应非 ok(状态码非 2xx)时抛出
 */
export function createLimitedFetch(options) {
  const limiter = new RateLimiter(options);
  return async function limitedFetch(url, init) {
    return limiter.schedule(async () => {
      const res = await fetch(url, init);
      if (!res.ok) throw new Error('HTTP ' + res.status);
      const ct = res.headers.get('content-type') || '';
      // 根据响应类型解析结果
      return ct.includes('application/json') ? res.json() : res.text();
    });
  };
}

// Example usage
/*
const limitedFetch = createLimitedFetch({ tokensPerInterval: 2, interval: 1000, maxTokens: 4 });
for (let i = 0; i < 10; i++) {
  limitedFetch('/api/data?id=' + i).then(console.log).catch(console.error);
}
*/

技术要点

  • 令牌桶算法:固定间隔补充令牌,令牌数上限受 capacity 约束。
  • 队列调度:任务按 FIFO 顺序执行;仅当有可用令牌时执行。
  • 一致的异步行为:schedule 使用 Promise.resolve().then(fn) 处理同步与异步任务。
  • 资源管理:提供 stop 方法清理 setInterval 定时器。
  • 并发安全(事件循环语义):单线程下 setInterval 回调与入队操作序列化执行。
  • fetch 包装:非 ok 响应抛错;依据 Content-Type 选择 res.json() 或 res.text()。

使用示例

// 创建每秒补充 2 个令牌、容量 4 的限流 fetch
const limitedFetch = createLimitedFetch({
  tokensPerInterval: 2,
  interval: 1000,
  maxTokens: 4,
});

// 并发发起请求,实际执行速率受限流器控制
Promise.allSettled(
  Array.from({ length: 10 }, (_, i) =>
    limitedFetch('/api/data?id=' + i)
  )
).then(console.log);

// 需要时可停止补充(释放资源)
// 注意:停止后队列将不再自动执行
// limiter 不对外暴露,这里如需手动 stop,请自定义工厂以返回 limiter 引用。

示例详情

解决的问题

面向前端与全栈团队,快速把任意 JavaScript 代码片段转化为清晰、统一、可直接落地的注释说明,帮助:

  • 标准化团队注释风格,减少沟通与返工
  • 加速代码审查与交接,缩短新人上手周期
  • 支持 JSDoc、块/行内等多种注释风格,自由切换与细节分级
  • 自动提炼函数意图、关键业务规则与边界条件,产出符合技术文档标准的说明
  • 在遗留代码治理、API说明、审查评估等场景可即插即用,提升代码可读性与可维护性,最终推动更快的交付节奏与更稳的质量

适用用户

前端开发工程师

为新功能与修复补全规范注释;在评审前一键生成说明,缩短走查;长期提升代码可读性与维护速度

全栈与技术负责人

统一团队注释口径与风格;批量为核心模块产出可复用注释;降低交接与迭代中的知识流失

测试与质量同学

快速获知函数预期与边界;据此完善测试要点与用例;减少对开发的反复确认

特征总结

一键为JS代码生成规范注释,迅速还原意图,省去逐行阅读时间,提升交付质量
自动识别核心函数与业务规则,生成可合并注释,协作与评审效率双提升
多种注释风格与详细程度一键切换,满足团队规范与不同读者阅读习惯
按文档结构生成概述、参数与返回说明,便于同步到知识库与对外材料
为遗留与复杂逻辑给出简洁解释,降低接手成本,让新成员当天即可维护
内置质量校对与一致性检查,避免含糊和遗漏,注释与实际行为高度一致
支持批量处理与模板化复用,统一项目口径,减少重复劳动与风格分裂
生成示例用法与关键要点,帮助快速理解场景与边界,减少沟通成本
严格遵循最小披露原则,仅基于代码产出,满足商业环境的合规与安全
适配提交前检查与代码评审场景,作为审查清单补充,减少往返沟通与返工

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

AI 提示词价格
¥20.00元
先用后买,用好了再付款,超安全!

您购买后可以获得什么

获得完整提示词模板
- 共 597 tokens
- 3 个可调节参数
{ 代码片段 } { 注释风格 } { 详细程度 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

半价获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59