热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
本提示词专为JavaScript开发场景设计,能够根据提供的代码片段自动生成精准、规范的注释说明。通过分析代码结构、功能逻辑和使用场景,生成符合技术文档标准的注释内容,帮助开发者快速理解代码意图、提升代码可维护性。支持多种注释风格选择,适应不同开发团队的需求规范,确保生成的注释既专业又实用。
该代码片段提供了常用的实用函数集合,包括:
/**
* 解码查询参数片段:先将加号(+)转换为空格,再进行 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;
}
}
parseQuery
debounce
formatCurrency
safeJSONParse
该代码实现了一个带内存缓存、超时控制与指数退避重试的 fetch 封装函数 fetchWithRetry。其特性包括:
// 基于内存的简单缓存: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;
}
const data = await fetchWithRetry('https://api.example.com/users', {
cacheTTL: 5000, // 缓存 5s
retries: 2, // 最多重试 2 次(总尝试 3 次)
timeout: 4000 // 单次超时 4s
});
// data 为 JSON 或文本,取决于响应 Content-Type
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);
}
*/
// 创建每秒补充 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 代码片段转化为清晰、统一、可直接落地的注释说明,帮助:
为新功能与修复补全规范注释;在评审前一键生成说明,缩短走查;长期提升代码可读性与维护速度
统一团队注释口径与风格;批量为核心模块产出可复用注释;降低交接与迭代中的知识流失
快速获知函数预期与边界;据此完善测试要点与用例;减少对开发的反复确认
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
半价获取高级提示词-优惠即将到期