¥
立即购买

JavaScript箭头函数生成器

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

本提示词专为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;
  };
})();

代码说明

  • 参数说明:

    • e: 原生事件对象或 React SyntheticEvent(必传)。用于阻止默认提交行为、定位按钮与表单。
    • options(可选对象):
      • delay: 去抖窗口期时长(毫秒),默认 300。窗口期内仅第一次点击会触发 onConfirm。
      • onConfirm: 真正的提交回调函数(必传)。签名为 (data, form, event) => void | Promise
        • data: 已自动剔除首尾空白的表单数据对象。同名字段会聚合为数组。
        • form: 关联的 form 元素(若可定位到)。
        • event: 原事件对象。
      • validate: 校验函数,默认返回 true。签名为 (data, form, event) => boolean
        • 返回 true 时执行 onConfirm,否则不执行并立即清理窗口期。
  • 返回值说明:

    • 返回一个清理函数 clear()。调用后会:
      • 清除仍在等待中的窗口期定时器;
      • 解除当前表单/按钮的“锁定”状态;
      • 使后续点击可立即再次触发提交。
  • 使用示例:

    • 在 React 18 函数组件中使用 onClick 绑定
      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>
        );
      };
      
  • 注意事项:

    • 本函数为“前沿触发”去抖:首次点击立即触发 onConfirm,窗口期内的后续点击不再触发;窗口期结束后可再次触发。
    • 需传入 onConfirm 函数;未提供时函数将仅阻止默认行为并返回空清理函数。
    • 仅处理点击触发的默认提交。若需要拦截键盘回车触发表单提交,请同时在 form 的 onSubmit 中做防重并调用相同逻辑。
    • 清洗逻辑基于 FormData:仅包含可提交字段(未勾选的复选框、禁用字段不会出现);同名字段会聚合为数组。
    • 为避免与受控组件冲突,函数不会直接修改输入控件的 value,仅在传给 onConfirm 的数据中做 trimming。
    • 定时器与锁以 WeakMap 记录在闭包中,按表单优先、退化到按钮粒度隔离;不会导致内存泄漏。

函数实现

// 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);
};

代码说明

  • 参数说明:

    • orders: Array<{ id, items, buyer, status, paidAt, total }>
      • items: Array,若 Item 含 quantity 数量字段则累加该字段;否则每条 item 计为 1 件
      • paidAt: Date | ISO字符串 | 时间戳(毫秒)
      • total: number,可被 Number() 转为数值
    • options:
      • from: Date | string | number,起始时间(含);默认 -Infinity 表示不限制
      • to: Date | string | number,结束时间(含);默认 Infinity 表示不限制
      • groupBy: string,默认 'buyer',指定以 order[groupBy] 分组
      • getKey: (order) => any,自定义分组键函数;若提供则优先于 groupBy
  • 返回值说明:

    • Array<{ key: any, orderCount: number, itemCount: number, totalAmount: number }>
      • key: 分组键值(默认为 buyer);当使用 getKey 时为其返回值
      • orderCount: 该分组下订单数量
      • itemCount: 该分组下商品总件数(基于 quantity 或按条目计数)
      • totalAmount: 该分组下总金额之和
    • 数组按 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' });
      
  • 注意事项:

    • 时间范围为闭区间:[from, to];若 from 或 to 无法解析为有效时间,或 from > to,将返回空数组。
    • 输入不会被修改;返回的是全新数组。内部仅对临时 Map 进行写入,不会影响外部数据。
    • items 非数组或条目无 quantity 时按 1 件计;quantity <= 0 或非数值将被忽略计为 0。
    • total 会用 Number() 转换为数值;无法转换时按 0 处理。
    • 自定义分组键建议保持可序列化与稳定性;当分组键为对象时,输出中的 key 将是该对象的引用。
    • 性能建议:
      • 时间解析已在循环外对 from/to 预计算;paidAt 每单解析一次。
      • 对超大数据集(>10万)请避免先构造中间数组再 reduce;当前实现为单次遍历聚合。
      • 排序为 O(k log k),k 为分组数;当分组数很大时可考虑只取前 N 名(例如使用 partial selection/堆)。

函数实现

// 生成的箭头函数代码
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 });
};

代码说明

  • 参数说明:

    • startUrl: string,分页抓取的起始地址。
    • options:
      • retry: number,重试次数(对每一页的请求,默认 2 次,指失败后再试的次数)。
      • backoff: number,首次重试等待基数(毫秒,默认 300),使用指数退避和全随机抖动:backoff * 2^(attempt-1),并在 [0..delay) 之间随机。
      • timeout: number,请求超时时间(毫秒,默认 8000),超时将中断该次 fetch 并按重试策略重试。
      • signal: AbortSignal,可选,外部传入的取消信号(如路由切换时触发)。
  • 返回值说明:

    • 返回一个可等待的 Promise,并带有 cancel 方法。
      • await 返回值:{ records: Array, durationMs: number }
        • records: 合并并去重后的记录数组,以 record.id(string 或 number)唯一;没有 id 的记录会保留,但不会参与去重。
        • durationMs: 整体抓取耗时(毫秒)。
      • 取消:通过返回值的 cancel() 主动中断整个过程;或通过传入的 signal 中断。取消会使 Promise 以 AbortError 拒绝。
  • 使用示例:

    • 基本使用
      // 初始化数据看板
      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(); // 中断所有未完成请求 }); ```

  • 与外部 AbortController 结合
    const controller = new AbortController();
    const task = fetchAllPages('/api/metrics', { signal: controller.signal });
    
    

// 某处触发 controller.abort(); // 将使 task 以 AbortError 失败 ```

  • 注意事项:
    • 响应格式要求:每页结果为 JSON,形如 { records: Array, next: string|null }。next 为空或假值表示结束。
    • 去重规则:仅对具有 string/number 类型 id 的记录去重;无 id 的记录全部保留。
    • 重试范围:仅对 429、网络错误(fetch 在浏览器中通常为 TypeError)以及超时进行重试;其他 HTTP 非 2xx(除 429)直接失败。
    • 超时实现:使用 Promise.race 控制整体超时,同时通过 AbortController 主动中止 fetch,避免资源泄露。
    • 取消语义:调用 cancel() 或外部 signal 触发时,将立即中止当前与后续请求,Promise 以 AbortError 拒绝,不返回部分结果。
    • 循环保护:若 next 出现循环引用,将抛出错误以避免无限抓取。
    • 环境要求:浏览器原生 fetch 与 AbortController。若在不支持 DOMException 的环境,错误对象将退化为 name 为 'TimeoutError' 的 Error。

示例详情

解决的问题

  • 让开发者用一句话描述需求,立即获得结构清晰、可读性强、可维护的箭头函数实现
  • 自动判断并选择合适的参数形态(解构、默认值、剩余参数等),减少重复思考与手工改写
  • 固化现代语法与团队约定,避免过时代码与隐性风险,降低代码评审与返工成本
  • 输出“代码+解释+示例+注意事项”的完整结果,帮助新人快速上手、老手迅速落地
  • 覆盖事件处理、数据转换、异步流程、业务逻辑封装等高频场景,显著提升迭代效率
  • 为个人与团队提供统一的函数风格与质量基线,缩短交付周期并提升稳定性

适用用户

前端开发工程师

快速生成表单校验、列表筛选与排序、事件处理等常用函数,减少样板代码与低级错误,提升交付速度

React/Vue组件开发者

一键产出回调与状态更新逻辑、组件内部工具函数与事件绑定写法,统一风格,缩短组件开发与重构时间

Node.js工程师

高效产出数据转换、参数校验、异步流程处理与业务工具函数,附带示例与注意事项,稳定性与可读性同步提升

特征总结

根据业务描述一键生成箭头函数,语义清晰,开箱可用,显著缩短从零编写与调试时间
智能选择参数解构与默认值,自动匹配返回结果结构,让代码更易读更稳健
覆盖事件回调、数组处理、异步流程与工具函数等高频场景,常见需求快速落地
自动附带参数说明、返回值解释与使用示例,减少沟通成本,新人也能快速接手
按功能复杂度生成最合适的函数形态,避免冗余逻辑与重复变量
严格遵循ES6+规范与团队最佳实践,降低代码评审成本与后续维护风险
内置安全与性能考量,规避危险写法与常见陷阱,让产出更可靠
输出结构统一、可读性高,可直接粘贴到React、Vue或Node项目中使用
支持以使用场景与复杂度参数化定制结果,灵活适配不同业务边界与风格

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

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

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

2. 发布为 API 接口调用

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

3. 在 MCP Client 中配置使用

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

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

您购买后可以获得什么

获得完整提示词模板
- 共 564 tokens
- 3 个可调节参数
{ 函数功能描述 } { 函数使用场景 } { 函数复杂度 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

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

17
:
23
小时
:
59
分钟
:
59