热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
本提示词专为JavaScript开发场景设计,能够根据函数功能描述快速生成符合最佳实践的箭头函数代码。它具备精准理解函数需求、自动选择合适参数结构、优化代码简洁性的能力,支持多种函数类型包括事件处理、数据处理、业务逻辑等。生成的代码具备良好的可读性和可维护性,严格遵循ES6+语法规范,帮助开发者提升编码效率和代码质量。
// 去抖(前沿触发)表单提交按钮点击处理:在窗口期内只允许一次提交
const handleSubmit = (() => {
// 使用闭包保存每个表单/按钮对应的定时器与锁,避免不同按钮之间相互影响
const stateMap = new WeakMap(); // key: form 元素(优先)或按钮元素
// 将表单数据转为对象并自动剔除首尾空白
const toCleanObject = (form) => {
if (!form) return {};
const fd = new FormData(form);
const data = Object.create(null);
for (const [k, v] of fd.entries()) {
const val = typeof v === 'string' ? v.trim() : v;
if (data[k] === undefined) {
data[k] = val;
} else if (Array.isArray(data[k])) {
data[k].push(val);
} else {
data[k] = [data[k], val];
}
}
return data;
};
// 返回真正的事件处理箭头函数
return (e, { delay = 300, onConfirm, validate = () => true } = {}) => {
if (!e || typeof e.preventDefault !== 'function') return () => {};
if (typeof onConfirm !== 'function') {
e.preventDefault();
return () => {};
}
// 阻止默认提交(点击 submit 按钮会触发表单默认提交)
e.preventDefault();
const btn = e.currentTarget || e.target;
const form = btn?.form || (btn?.closest ? btn.closest('form') : null) || null;
// 针对同一个 form(优先)或同一个按钮做窗口期保护
const key = form || btn;
const prev = stateMap.get(key) || { timerId: null, locked: false };
// 在窗口期内:直接返回一个可清理函数(不再触发 onConfirm)
if (prev.locked) {
return () => {
if (prev.timerId) clearTimeout(prev.timerId);
stateMap.delete(key);
};
}
// 进入窗口期(前沿触发一次)
prev.locked = true;
// 清理函数:可手动取消窗口期
const clear = () => {
if (prev.timerId) clearTimeout(prev.timerId);
prev.timerId = null;
prev.locked = false;
stateMap.delete(key);
};
// 设置窗口期定时器,窗口结束后自动解锁
prev.timerId = setTimeout(() => {
prev.timerId = null;
prev.locked = false;
stateMap.delete(key);
}, delay);
stateMap.set(key, prev);
// 采集并清洗表单数据
const cleaned = toCleanObject(form);
// 校验失败则不提交并立即清理窗口期
if (!validate(cleaned, form, e)) {
clear();
return clear;
}
// 触发真正提交回调(支持同步/异步)
// 将 cleaned 数据、form 节点与事件对象传入,便于业务使用
Promise.resolve(onConfirm(cleaned, form, e)).catch(() => {
// onConfirm 抛错不影响窗口期清理策略
});
return clear;
};
})();
参数说明:
返回值说明:
使用示例:
const MyForm = () => {
const onConfirm = async (data) => {
// 发起提交请求
await fetch('/api/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
};
const validate = (data) => {
// 简单校验示例:必须有 email
return typeof data.email === 'string' && data.email.length > 0;
};
return (
<form>
<input name="email" type="email" />
<input name="name" />
<button
type="submit"
onClick={(e) => {
// 可选:保存返回的清理函数,用于在需要时手动解除窗口期
const clear = handleSubmit(e, { delay: 500, onConfirm, validate });
// 例如:在某些情况希望主动恢复可点击状态
// setTimeout(clear, 200);
}}
>
提交
</button>
</form>
);
};
注意事项:
// summarizeOrders: 纯函数,按 buyer(或可自定义分组键)汇总订单
// - 过滤 status==='canceled'
// - 时间范围为闭区间 [from, to]
// - 仅对输入做不可变读操作,返回新的结果数组(按总金额降序)
const summarizeOrders = (
orders = [],
{
from = -Infinity,
to = Infinity,
groupBy = 'buyer', // 默认按 buyer 分组
getKey, // 可选:自定义分组键函数 (order) => any
} = {}
) => {
const toTs = v => {
if (v === Infinity || v === -Infinity) return v;
if (v == null) return NaN;
const n = typeof v === 'number' ? v : Date.parse(v);
return Number.isFinite(n) ? n : NaN;
};
const fromTs = toTs(from);
const toTsVal = toTs(to);
// 不合法时间范围,直接返回空数组
if (!Number.isFinite(fromTs) && fromTs !== -Infinity) return [];
if (!Number.isFinite(toTsVal) && toTsVal !== Infinity) return [];
if (fromTs > toTsVal) return [];
const resolveKey = getKey
? (order) => getKey(order)
: (order) => {
const key = order?.[groupBy];
return key ?? 'UNKNOWN';
};
// 单次遍历聚合
const map = orders.reduce((acc, order) => {
if (!order || order.status === 'canceled') return acc;
const { paidAt, items = [], total = 0 } = order;
const ts = toTs(paidAt);
if (!Number.isFinite(ts) || ts < fromTs || ts > toTsVal) return acc;
const key = resolveKey(order);
// 统计本单的件数(优先 quantity,没有则记为1件)
const addItems = Array.isArray(items)
? items.reduce((n, it = {}) => {
const { quantity = 1 } = it || {};
const q = Number.isFinite(quantity) && quantity > 0 ? quantity : 0;
return n + q;
}, 0)
: 0;
const addTotal = Number.isFinite(+total) ? +total : 0;
const prev = acc.get(key) || { key, orderCount: 0, itemCount: 0, totalAmount: 0 };
acc.set(key, {
key,
orderCount: prev.orderCount + 1,
itemCount: prev.itemCount + addItems,
totalAmount: prev.totalAmount + addTotal,
});
return acc;
}, new Map());
// 返回按总金额降序的数组
return [...map.values()].sort((a, b) => b.totalAmount - a.totalAmount);
};
参数说明:
返回值说明:
使用示例:
基础用法(默认按 buyer 分组,并限定时间范围)
const orders = [
{ id: 1, buyer: 'Alice', status: 'paid', paidAt: '2024-01-10T10:00:00Z', total: 120, items: [{ sku: 'A', quantity: 2 }] },
{ id: 2, buyer: 'Bob', status: 'paid', paidAt: '2024-01-11T10:00:00Z', total: 80, items: [{ sku: 'B' }] },
{ id: 3, buyer: 'Alice', status: 'canceled', paidAt: '2024-01-12T10:00:00Z', total: 50, items: [{ sku: 'C', quantity: 3 }] },
{ id: 4, buyer: 'Alice', status: 'paid', paidAt: 1704976800000, total: 40, items: [{ sku: 'D', quantity: 1 }] }, // 时间戳
];
const summary = summarizeOrders(orders, {
from: '2024-01-01T00:00:00Z',
to: '2024-01-31T23:59:59Z',
});
// => [
// { key: 'Alice', orderCount: 2, itemCount: 3, totalAmount: 160 },
// { key: 'Bob', orderCount: 1, itemCount: 1, totalAmount: 80 }
// ]
自定义分组键:按 buyer.id 分组(拓展方式)
const summaryByBuyerId = summarizeOrders(orders, {
from: '2024-01-01',
to: '2024-12-31',
getKey: ({ buyer }) => (buyer && typeof buyer === 'object' ? buyer.id : buyer ?? 'UNKNOWN'),
});
继续使用 groupBy 但不写 getKey(当分组字段是扁平属性时)
// 例如订单有 channel 字段时
const summaryByChannel = summarizeOrders(orders, { groupBy: 'channel' });
注意事项:
// 生成的箭头函数代码
const fetchAllPages = (startUrl, { retry = 2, backoff = 300, timeout = 8000, signal } = {}) => {
if (typeof startUrl !== 'string' || !startUrl.trim()) {
throw new TypeError('fetchAllPages: startUrl must be a non-empty string');
}
// helpers
const now = typeof performance !== 'undefined' && performance && typeof performance.now === 'function'
? () => performance.now()
: () => Date.now();
const createTimeoutError = (ms) => {
try {
return new DOMException(`Request timed out after ${ms}ms`, 'TimeoutError');
} catch {
const e = new Error(`Request timed out after ${ms}ms`);
e.name = 'TimeoutError';
return e;
}
};
const sleep = (ms, abortSignal) => new Promise((resolve, reject) => {
if (ms <= 0) return resolve();
let tid;
const cleanup = () => {
if (tid) clearTimeout(tid);
if (abortSignal) abortSignal.removeEventListener('abort', onAbort);
};
const onAbort = () => {
cleanup();
reject(abortSignal.reason || new DOMException('Aborted', 'AbortError'));
};
if (abortSignal) {
if (abortSignal.aborted) return onAbort();
abortSignal.addEventListener('abort', onAbort, { once: true });
}
tid = setTimeout(() => {
cleanup();
resolve();
}, ms);
});
const addJitter = (ms) => Math.floor(Math.random() * ms); // full jitter [0..ms)
const linkAbort = (srcSignal, dstController) => {
if (!srcSignal) return () => {};
const forward = () => dstController.abort(srcSignal.reason || new DOMException('Aborted', 'AbortError'));
if (srcSignal.aborted) {
forward();
return () => {};
}
srcSignal.addEventListener('abort', forward, { once: true });
return () => srcSignal.removeEventListener('abort', forward);
};
// outer controller governs the whole task
const outerController = new AbortController();
const unlinkExternal = linkAbort(signal, outerController);
let settled = false;
const cancel = (reason = new DOMException('Aborted', 'AbortError')) => {
if (!outerController.signal.aborted) outerController.abort(reason);
};
const fetchPage = async (url) => {
let attempt = 0;
// retry loop
// retry applies to 429, timeout, and network errors only
// other HTTP errors fail fast
// backoff: exponential with full jitter
while (true) {
attempt += 1;
const attemptController = new AbortController();
const unlinkOuter = linkAbort(outerController.signal, attemptController);
let timer;
const timeoutPromise = new Promise((_, reject) => {
timer = setTimeout(() => {
const err = createTimeoutError(timeout);
// abort the fetch to avoid dangling work
attemptController.abort(err);
reject(err);
}, timeout);
});
try {
const res = await Promise.race([
fetch(url, { signal: attemptController.signal, headers: { accept: 'application/json' } }),
timeoutPromise
]);
// If the race timed out, the above await would have thrown; reaching here means fetch resolved
if (res.status === 429) {
const err = new Error('Too Many Requests');
err.code = 'HTTP_429';
throw err;
}
if (!res.ok) {
const err = new Error(`HTTP ${res.status} ${res.statusText || ''}`.trim());
err.code = 'HTTP_ERROR';
err.status = res.status;
throw err;
}
// Robust JSON parse; will throw on invalid JSON
const data = await res.json();
return data;
} catch (err) {
// If the whole task was cancelled, propagate immediately
if (outerController.signal.aborted) {
throw outerController.signal.reason || err;
}
// Decide retryability
const isTimeout = err && err.name === 'TimeoutError';
const isNetwork = err && err.name === 'TypeError'; // fetch network error in browsers
const isInnerAbortTimeout = err && err.name === 'AbortError' && !outerController.signal.aborted; // our per-attempt abort due to timeout
const is429 = err && err.code === 'HTTP_429';
const retryable = is429 || isTimeout || isNetwork || isInnerAbortTimeout;
if (!retryable || attempt > retry) {
throw err;
}
const delay = addJitter(backoff * (2 ** (attempt - 1)));
await sleep(delay, outerController.signal);
// retry
} finally {
if (timer) clearTimeout(timer);
unlinkOuter();
}
}
};
const t0 = now();
const promise = (async () => {
try {
const byId = new Map(); // id -> record
const idless = []; // records without numeric/string id
const seen = new Set(); // detect accidental loops
let url = startUrl;
while (url) {
if (outerController.signal.aborted) {
throw outerController.signal.reason || new DOMException('Aborted', 'AbortError');
}
if (seen.has(url)) {
throw new Error('fetchAllPages: detected circular "next" references');
}
seen.add(url);
const { records = [], next = null } = await fetchPage(url);
if (Array.isArray(records)) {
for (const rec of records) {
const id = rec != null && (typeof rec.id === 'string' || typeof rec.id === 'number') ? rec.id : undefined;
if (id === undefined) {
idless.push(rec);
} else if (!byId.has(id)) {
byId.set(id, rec);
}
}
}
url = next || null;
}
const resultRecords = [...byId.values(), ...idless];
const durationMs = Math.round(now() - t0);
settled = true;
return { records: resultRecords, durationMs };
} finally {
unlinkExternal();
}
})();
return Object.assign(promise, { cancel });
};
参数说明:
返回值说明:
使用示例:
// 初始化数据看板
const task = fetchAllPages('/api/metrics?cursor=start', {
retry: 3,
backoff: 400,
timeout: 7000
});
try {
const { records, durationMs } = await task;
console.log('records:', records.length, 'duration:', durationMs, 'ms');
} catch (e) {
if (e.name === 'AbortError') {
console.warn('fetchAllPages cancelled');
} else {
console.error('fetchAllPages failed:', e);
}
}
const task = fetchAllPages('/api/metrics?cursor=start');
// 路由切换时 router.beforeEach(() => { task.cancel(); // 中断所有未完成请求 }); ```
const controller = new AbortController();
const task = fetchAllPages('/api/metrics', { signal: controller.signal });
// 某处触发 controller.abort(); // 将使 task 以 AbortError 失败 ```
快速生成表单校验、列表筛选与排序、事件处理等常用函数,减少样板代码与低级错误,提升交付速度
一键产出回调与状态更新逻辑、组件内部工具函数与事件绑定写法,统一风格,缩短组件开发与重构时间
高效产出数据转换、参数校验、异步流程处理与业务工具函数,附带示例与注意事项,稳定性与可读性同步提升
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
半价获取高级提示词-优惠即将到期